保持源的具体化值传递给分块请求实体(客户端)

时间:2018-02-11 22:20:08

标签: scala akka akka-stream akka-http

Akka HTTP客户端API允许将Source[ChunkStreamPart, Any]传递给HttpEntity.Chunked,这样就可以将ByteString的流推送到具有背压处理的单个HTTP请求中:

val data: Source[ByteString, Future[ImportantInformation]]
val chunkedEntity = HttpEntity.Chunked(
    ContentTypes.`application/octet-stream`, 
    data.map(ChunkStreamPart(_)))
val request = HttpRequest(HttpMethods.POST,
    Uri("http://targethost/path"), entity = chunkedEntity)
val downstreamResp : Future[HttpResponse] = Http().singleRequest(request)

现在,源在传输层中消耗得很远,我找不到从Future[ImportantInformation]访问Source具体化值的方法。有没有办法解决这个问题,即可以让我访问具体化值的方法,或者甚至库中的某种SinkByteString s流汇入< em>单个 HTTP请求?

2 个答案:

答案 0 :(得分:2)

您可以在源上使用mapMaterializedValue来访问其具体化值。

val data: Source[ByteString, Future[ImportantInformation]]
val mappeddata = 
  data.mapMaterializedValue(future => processImportantInformation(future))

答案 1 :(得分:1)

如果您不需要指定ImportantInformation但只是想知道Source何时收到终止消息,那么您可以使用Source.watchTermination。这将实现Future[Done]

有一个很好的例子found here