Akka-streams - 如何访问流的物化值

9

这可能是你问题的解决方案: https://dev59.com/AVoV5IYBdhLWcg3wVNeZ#36467193它基于这里的讨论: https://github.com/akka/akka/issues/17769#issuecomment-206532674 - ncreep
1个回答

10

使用Source.viaMat函数可以实现这一点。扩展您问题中提供的链接中的代码示例:

import akka.http.scaladsl.Http.HostConnectionPool
import akka.stream.scaladsl.Keep
import akka.stream.scaladsl.RunnableGraph

val poolClientFlow = Http().cachedHostConnectionPool[Int]("akka.io")

val graph: RunnableGraph[(HostConnectionPool, Future[(Try[HttpResponse], Int)])]  =
  Source.single(HttpRequest(uri = "/") -> 42)
        .viaMat(poolClientFlow)(Keep.right)
        .toMat(Sink.head)(Keep.both)

val (pool, fut) = graph.run()

pool.shutdown()

由于Source.single实例化为Unit,因此Keep.right表示保留poolClientFlow实例化的HostConnectionPool。在.toMat函数中,Keep.both表示保留流的左侧池和Sink的右侧Future


1
非常感谢您的回答,toMat()(Keep.both)确实很有帮助。但是如果我想在代码中不同的位置访问池,该怎么办呢?做类似这样的事情是否有意义:Source.empty.viaMat(poolClientFlow)(Keep.right).to(Sink.ignore).run()只是为了获得对池的访问权限?我猜在一般情况下,每个流都可以被实例化为一个不同的实例,但在这里,它是同一个共享池... - Yardena
@Yardena 没关系。我从未尝试在流的上下文之外访问材料化池。要做到这一点,看起来您可以使用与 Http.newHostConnectionPool 设置相同的设置调用 HostConnectionPool 构造函数。这应该返回相同的实例,但我不想将其放在我的答案中,因为我以前从未尝试过。祝你愉快地编程。 - Ramón J Romero y Vigil
再次感谢,我想我会坚持使用Http().shutdownAllConnectionPools()。 - Yardena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接