一段时间后,Akka HTTP Stream侦听器停止处理数据字节

时间:2016-09-27 23:09:46

标签: akka akka-stream akka-http

我有一个应用程序有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个,我删除了分组的阶段。几分钟后仍然发生。我怀疑流是基于超时关闭的。我所做的只是获取大块并消耗掉它们。

====更新====

找到原因,见下文。

1 个答案:

答案 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