2015-08-26 15 views
7

के पार हो गई कॉन्फ़िगर किया गया अधिकतम-खुले अनुरोधों मूल्य मैं निम्नलिखित कोडअक्का Http: [32]

def post(endpoint: String, entity: Strict) = { 
    Http().singleRequest(HttpRequest(uri = Notifier.notificationUrl + endpoint, method = HttpMethods.POST, 
     entity = entity)) onComplete { 
     case Success(response) => response match { 
     case HttpResponse(StatusCodes.OK, _, _, _) => 
      log.info("communicated successfully with Server") 
     } 
     case Failure(response) => 
     log.error("communicated failed with Server: {}", response) 
    } 
    } 

यह

निम्नलिखित के रूप में हर 10 seconds जब Notifier अभिनेता को मिलने वाले संदेश में कहा जाता है का उपयोग कर सर्वर से कुछ डेटा पोस्ट
case ecMonitorInformation: ECMonitorInformation => 
    post("monitor", httpEntityFromJson(ecMonitorInformation.toJson)) 

समस्या?

मुझे लगता है कि प्रारंभ में (लगभग 5 सर्वर पर जाने का अनुरोध) लेकिन फिर यह लटका हुआ है, मुझे कोई लॉगिंग नहीं दिखाई दे रही है, सर्वर को कोई डेटा प्राप्त नहीं होता है। क्लाइंट साइड पर थोड़ी देर के बाद, मुझे निम्नलिखित

ERROR c.s.e.notification.Notifier - communicated failed with Server: java.lang.RuntimeException: Exceeded configured max-open-requests value of [32] 

क्या चल रहा है? मैं यह समस्या कैसे हल करूं?

+1

पर अधिक जानकारी देखें आप अंतर्निहित पूल में खुले अनुरोधों की कुल संख्या के लिए डिफ़ॉल्ट सीमा को मार रहे हैं, जिसके लिए आप किस मेजबान से बात कर रहे हैं। क्या आपके पूल में अनुरोध ठीक से पूरा हो रहे हैं? मेरा अनुमान है कि वे नहीं हैं और यही वजह है कि पूल का बैक अप ले रहा है और इस प्रकार इस सीमा को मार रहा है। आप सीमा बढ़ा सकते हैं लेकिन लगता है कि जब तक आप लटकने के अनुरोधों को ठीक नहीं कर लेते हैं, तब तक आप अपरिहार्य देरी कर सकते हैं। – cmbaxter

+0

आपको Http() का केवल एक उदाहरण होना चाहिए। समाधान के साथ इसी तरह की समस्या जिसे आप ढूंढ सकते हैं (स्प्रे के लिए) http://stackoverflow.com/questions/29324591/spray-client-throwing-too-many-open-files-exception-when-giving-more-concurren – Yoda

+0

@Yoda , जिसने समस्या को हल नहीं किया है – daydreamer

उत्तर

2

मैं docs माध्यम से चला गया और निम्नलिखित

val connectionFlow: Flow[HttpRequest, HttpResponse, 
     Future[Http.OutgoingConnection]] = 
     Http().outgoingConnection(host = "localhost", port = 8080) 

और फिर

def httpPost(uri: String, httpEntity:Strict) { 
    val responseFuture: Future[HttpResponse] = 
     Source.single(HttpRequest(uri = "/monitor", method = HttpMethods.POST, entity=httpEntity)) 
     .via(connectionFlow) 
     .runWith(Sink.head) 

    responseFuture onComplete { 
     case Success(response) => log.info("Communicated with Server: {}", response) 
     case Failure(failure) => log.error("Communication failed with Server: {}", failure) 
    } 

की कोशिश की और इस

+0

क्या विफल प्रतिक्रियाओं को पुनः प्रयास करना संभव है? – Tvaroh

+0

आप आदर्श रूप से कर सकते हैं क्योंकि आप जानते हैं कि यह – daydreamer

+0

विफल रहा है, जबकि यह काम करता है, यह भी बहुत अप्रभावी है क्योंकि प्रत्येक अनुरोध के लिए एक नया कनेक्शन बनाया गया है। यह सभी प्रकार की समस्याओं को लाएगा। त्रुटि संदेश क्या कहता है: अरे, आप बहुत सारे अनुरोध बना रहे हैं जिन्हें कहीं भी buffered किया जाएगा और लंबे समय तक एक कतार में फंस सकता है। यह "समाधान" कहता है: जो कुछ भी हो, सर्वर को डॉस करें। अंत में, अनुरोध अब कहीं और अटक जाएंगे। – jrudolph

1

आप बार-बार अपने विधि बुला होने जा रहे हैं, तो आप को यहां बताए गए कनेक्शन पूल आधारित क्लाइंट एक विधि का उपयोग पर विचार करना चाहते हो सकता है: http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0/scala/http/client-side/index.html

तुम भी अक्का में कनेक्शन पूल सेटिंग्स सेट कर सकते हैं -http क्लाइंट कॉन्फ़िगरेशन: http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0/scala/http/configuration.html#akka-http-core

होस्ट-कनेक्शन-पूल के लिए खोजें।

+0

'एकलRequest' हुड के नीचे एक कैश होस्ट होस्ट पूल का उपयोग करेगा इसलिए मुझे नहीं लगता कि यह जवाब है। – cmbaxter

+0

कनेक्शन पूल को कॉन्फ़िगर करने के बारे में एक नोट जोड़ा गया। –

0

आप Source.single के बजाय Source.queue का उपयोग बफरिंग और अतिप्रवाह प्रदान करने के लिए कर सकता है मेरे लिए काम किया रणनीति। https://stackoverflow.com/a/35115314/1699837

संबंधित मुद्दे