我正在嘗試從 akka 演員發送數百個 http 請求,但是我收到了
akka.stream.BufferOverflowException: Exceeded configured max-open-requests value of [16]. This means that the request queue of this pool (HostConnectionPoolSetup(places.api.here.com,443,ConnectionPoolSetup(ConnectionPoolSettings(16,1,5,16,1,Duration.Inf,100 milliseconds,2 minutes,30 seconds,ClientConnectionSettings(Some(User-Agent: akka-http/10.2.0)...
這是application.conf
http {
host-connection-pool {
max-connections = 16
min-connections = 1
max-open-requests = 16
}
}
這是代碼
override def receive: Receive = {
case Foo(_) =>
val res: Future[HttpResponse] = Http().singleRequest(HttpRequest(uri = "http://..."))
// do something for the result
我試圖通過狀態控制,例如
override def receive: Receive = run(0)
def run(openRequests: Int) : Receive = {
case Foo(_) if openRequests <= 16 =>
context.become(run(openRequests 1))
val responseFuture: Future[HttpResponse] = Http().singleRequest(HttpRequest(uri = "http://..."))
responseFuture.foreach(context.become(run(openRequests - 1)))
//...
無論哪種方式,我都得到了相同的例外 BufferOverflowException
任何建議將不勝感激
uj5u.com熱心網友回復:
使用context內部的異步Future是一個壞主意。context 它僅在呼叫actor 期間有效。
該缺陷是,context.become(run(openRequests - 1))使用的價值openRequests在當時Future,當它被呼叫時創建,而不是價值。因此,當第一個請求完成時,context.become(run(-1))即使可能有 15 個未完成的請求,它也會呼叫(這顯然是假的)。
解決辦法是在 中給自己發私信,foreach而不是context.become直接打電話。當參與者處理該訊息時,它會減少當前請求計數并在必要時發送新請求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/336044.html
上一篇:類路徑中缺少符號“typescala.package.Serializable”
下一篇:Spark的spark_driver_dagscheduler_messageprocessingtime_type_timers_count指標的增加行為是為了什么?
