मैं अक्का धाराओं के साथ एसिंक्रोनस http कॉल करने की कोशिश कर रहा हूं।
मैंने यही कोशिश की।
Source(listEndpoints)
.mapAsync(20)(endpoint => Future(Await.result(request(HttpMethods.POST, endpoint, List(authHeader)), timeout)))
.runWith(Sink.seq[HttpResponse])
मैं अनुरोध विधि के भीतर akka-http
का उपयोग कर रहा हूं और यह Future[HttpResponse]
लौटाता है
मुझे लगता है कि मैं यहां Future
को गाली दे रहा हूं। उपरोक्त कोड मुझे एक Future[List[HttpResponse]]
देगा और मुझे List[HttpResponse]
प्राप्त करने के लिए Await
का फिर से उपयोग करना होगा। क्या mapAsync
के भीतर समयबाह्य कार्यों के लिए एक और शानदार तरीका है?
1 उत्तर
किसी बिंदु पर आपकी request
पद्धति को मान लेना
Http().singleRequest
Future[HttpResponse]
प्राप्त करने के लिए, आप अनुरोध के लिए एक टाइमआउट पास कर सकते हैं:
// inside def request(...), will probably need to add a timeout argument here
val request = ??? // Build the HttpRequest
Http().singleRequest(
request = request,
settings = ConnectionPoolSettings.default.withMaxConnectionLifetime(timeout)
तब आपकी धारा बस होगी
Source(listEndpoints)
.mapAsync(request(...))
.runWith(Sink.seq[HttpResponse])
और Future[List[HttpResponse]]
को पूरा करने के लिए आपको केवल "दुनिया के अंत" पर Await
की आवश्यकता होगी।
आप akka.http.host-connection-pool.max-connection-lifetime
के साथ application.conf
में डिफ़ॉल्ट अधिकतम कनेक्शन जीवनकाल भी बदल सकते हैं