在Playframework中使用流式HTTP分块响应

时间:2018-08-14 14:58:08

标签: java playframework akka akka-stream playframework-2.6

我正在尝试使用Play框架2.6在Java中构建REST API,该API将以块的形式向客户端发送响应。为此,我按照Play HTTP响应流的documentation遵循分块响应构建器示例。

在该示例中(也在下面复制),在发送块之后,它关闭了源。经过一些处理后,如何保持源打开并使用sourceActor继续发送更多消息?此处理可能在其他有权访问sourceActor的actor中进行。

error

1 个答案:

答案 0 :(得分:0)

使用BroadcastHub

Pair<ActorRef, Source<ByteString, NotUsed>> source =
  Source.<ByteString>actorRef(256, OverflowStrategy.dropNew())
    .toMat(BroadcastHub.of(ByteString.class), Keep.both())
    .run(materializer);

ActorRef sourceActor = source.first();
Source<ByteString, NotUsed> matSource = source.second();

发送到实例化角色的消息会向下游发出,您可以使用实例化源来完成该方法(请注意,这种方法没有背压):

sourceActor.tell(ByteString.fromString("kiki"), ActorRef.noSender());
// send more messages to sourceActor...

return ok().chunked(matSource);

您可能需要使用keepAlive将消息注入流中以使其保持打开状态。