मैं अक्का धाराओं के साथ एसिंक्रोनस 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 के भीतर समयबाह्य कार्यों के लिए एक और शानदार तरीका है?

0
KAY_YAK 17 नवम्बर 2020, 23:18

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 में डिफ़ॉल्ट अधिकतम कनेक्शन जीवनकाल भी बदल सकते हैं

2
Levi Ramsey 18 नवम्बर 2020, 00:58