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
具体化值的方法。有没有办法解决这个问题,即可以让我访问具体化值的方法,或者甚至库中的某种Sink
将ByteString
s流汇入< em>单个 HTTP请求?
答案 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。