我有一个应用程序有3个像这样的HTTP侦听器:
val futureResponse1: Future[HttpResponse] =
Http().singleRequest(HttpRequest(uri = someUrl))
3中的每一个都在收听一个非停止流(每个流都是不同的流)。并使用简单的流程处理它,从分组开始,然后是相对快速的处理(非阻塞):
futureResponse1.flatMap {response =>
response.status match {
case StatusCodes.OK =>
val source: Source[ByteString, Any] = response.entity.dataBytes
source.
grouped(100).
map(doSomethingFast).
runWith(Sink.ignore)
case notOK => system.log.info("failed opening, status: " + notOK.toString())
}
...
我没有例外或警告。但过了一会儿(可能是15-25分钟),听众突然停了下来。一个接一个(不在一起)。
也许它的分组阶段是那里的问题?或者连接/流可能会停止?或者他们共享的调度员正在变得饥饿/没有被释放的东西。
为什么可能会发生这种想法?
====更新====
@Ramon J Romero y Vigil 我改变了我的运行只有1个流而不是3个,我删除了分组的阶段。几分钟后仍然发生。我怀疑流是基于超时关闭的。我所做的只是获取大块并消耗掉它们。
====更新====
找到原因,见下文。
答案 0 :(得分:1)
这就是原因:
EntityStreamSizeException:实际实体大小(无)超出内容长度限制(8388608字节)!您可以通过在实现dataBytes流之前设置akka.http。[server | client] .parsing.max-content-length或调用HttpEntity.withSizeLimit来配置它。
对于在连续响应流的情况下寻求解决方案的任何人,您可以使用withoutSizeLimit以这种方式获取源:
val source: Source[ByteString, Any] = response.entity.withoutSizeLimit().dataBytes