将Akka HTTP直接连接到Akka Stream Flow

时间:2018-04-07 22:08:02

标签: java akka akka-http

我在https://doc.akka.io/docs/akka-http/current/introduction.html查看了Akka HTTP路由的示例,奇怪的是,建立在Akka Streams之上的内容没有一个示例连接到流。

有人可以展示一个创建Java DSL流程的简单示例(请不要使用Scala),然后将Route直接连接到该流程吗?

或者我错过了这一点并且它不可能但需要Route中的一些CompletionStage代码来等待调用Flow的胶水代码的结果?

编辑:澄清流程可以做一些事情,比如将字符串附加到已发布的请求正文。

2 个答案:

答案 0 :(得分:3)

使用akka流完成路线绝对是可能的。它涉及:

  • 网络套接字路由,请参阅文档中的examples
  • 一个分块的http响应(因为如果它是从流中提供的,你通常不知道响应的大小)。你可以从akka流源的ByteStrings来源create a Chunked Entity
  • 如果事先知道响应大小,您还可以使用其他响应类型,请参阅HttpEntity有关其详细信息的文档

答案 1 :(得分:1)

  

编辑:澄清流程可以做一些事情,比如将字符串附加到已发布的请求正文。

Michał的答案包含很好的链接,所以请给他们一个阅读。默认情况下,Akka HTTP始终使用其数据进行流式传输 - 例如实体。因此,例如,要进行流式“回声”,同时添加后缀,您可以执行以下操作:

path("test", () ->
  // extract the request entity, it contains the streamed entity as `getDataBytes`
  extractRequestEntity(requestEntity -> {

  // prepare what to add as suffix to the incoming entity stream:
  Source<ByteString, NotUsed> suffixSource = 
    Source.single(ByteString.fromString("\n\nADDS THIS AFTER INCOMING ENTITY"))

  // concat the suffix stream to the incoming entity stream
  Source<ByteString, Object> replySource = requestEntity.getDataBytes()
    .concat(suffixSource);

    // prepare and return the entity:
    HttpEntity.Chunked replyEntity = HttpEntities.create(ContentTypes.TEXT_PLAIN_UTF8, replySource);
    return complete(StatusCodes.OK, replyEntity);
  })
);

话虽如此,有许多方法可以利用流媒体功能,包括框架JSON Streaming等。您还应该docs page about implications of streaming阅读。