简体   繁体   English

Akka-http:Http.cachedHostConnectionPoolHttps在一段时间后停止处理非2XX响应

[英]Akka-http: Http.cachedHostConnectionPoolHttps stops processing after sometime for non 2XX responses

I am trying to use cachedHostConnectionPoolHttps to make outbound https requests, but it seems that after some time for Non 2XX responses, the pool flow stops emitting out element's thus causing the entire flow to stop. 我正在尝试使用cachedHostConnectionPoolHttps来发出出站https请求,但似乎在非2XX响应一段时间后,池流停止发出元素,从而导致整个流停止。 The time of occurrence of this particular behaviour is quite random but happens and is reproducible. 这种特定行为的发生时间是相当随机的,但是发生并且是可重复的。

Here is a sample test in which it stops emitting results after some time Expected OnNext(_), yet no element signaled during 10 seconds is thrown 这是一个示例测试,它在一段时间后停止发出结果Expected OnNext(_), yet no element signaled during 10 seconds

import java.util.UUID

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.http.scaladsl.model.headers.RawHeader
import akka.stream._
import akka.stream.scaladsl.Keep
import akka.stream.testkit.scaladsl.{TestSink, TestSource}
import org.scalatest._

import scala.util.Random

class HttpPoolTest extends FlatSpec with Matchers with OptionValues with Inside with Inspectors {

  "HttpPoolTest" should "run without exception" in {
    implicit val httpSystem = ActorSystem("http-out")
    implicit val httpMat = ActorMaterializer()
    implicit val ec = httpSystem.dispatcher

    val helloFlow = Http().cachedHostConnectionPoolHttps[Int]("android.googleapis.com",443)(httpMat)

    val requestHeaders = scala.collection.immutable.Seq[HttpHeader](RawHeader("Authorization", "key=random" ), RawHeader("Content-Type", "application/json;charset=utf-8"))
    val httpRequest = new HttpRequest(HttpMethods.POST, "/gcm/send", requestHeaders,
      """
        |{
        |    "registration_ids": ["rnadomdata"],
        |    "delay_while_idle": true,
        |    "data": {
        |        "message": "Hello World",
        |        "title": "Interstellar",
        |        "id": "1231222i3211232228w2t1xx6wxq",
        |        "notificationType": "Text"
        |    }
        |}
      """.
        stripMargin)

    val (upstream , downstream) = TestSource.probe[(HttpRequest, Int)].via(helloFlow).toMat(TestSink.probe)(Keep.both).run()


    while (true) {
      val randWait = math.max(5000, Random.nextInt(20000)) //atleast 5 seconds to process the http request
      val randRequest = math.max(1, Random.nextInt(5))
      downstream.request(randRequest)

      (1 to randRequest).foreach(i => upstream.sendNext(httpRequest -> UUID.randomUUID().hashCode()))
      println (s"Waiting for $randWait millis to process")
      Thread.sleep(randWait)
      (1 to randRequest) foreach (i => noException should be thrownBy downstream.expectNext())

    }
  }

}

Any pointers what is going on wrong here? 什么指针在这里错了? It works for sometime, so I suspect something is going wrong while handling the non 2xx error. 它可以工作一段时间,所以我怀疑在处理非2xx错误时出现了问题。

I have tried turning off akka.http.host-connection-pool.max-retries = 0 and akka.http.host-connection-pool.idle-timeout = infinite , but no results. 我试过关闭akka.http.host-connection-pool.max-retries = 0akka.http.host-connection-pool.idle-timeout = infinite ,但没有结果。

You need to consume the entity databytes to ensure the httpFlow continues running. 您需要使用实体数据库以确保httpFlow继续运行。 Incase you aren't interested in interpreting body of the httpResponse, just read it through to sink. 如果您对解释httpResponse的主体不感兴趣,只需将其读取到接收器即可。

downstream.expectNext().entity.dataBytes.to(Sink.ignore)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM