【问题标题】:Akka-streams - how to access the materialized value of the streamAkka-streams - 如何访问流的物化值
【发布时间】:2016-04-27 17:43:41
【问题描述】:

我正在学习使用 Akka 流,并且非常喜欢它,但物化部分对我来说仍然有点神秘。

引用http://doc.akka.io/docs/akka-stream-and-http-experimental/snapshot/scala/http/client-side/host-level.html#host-level-api

... 通过调用触发特定池的立即关闭 池客户端的 HostConnectionPool 实例上的 shutdown() 流实现为

如何获取 HostConnectionPool 实例?

更重要的是,我想大致了解如何访问具体化的值并执行一些操作或从中检索信息。

提前感谢任何文档指针或解释。

【问题讨论】:

标签: scala akka-stream akka-http


【解决方案1】:

这是通过Source.viaMat 函数完成的。从您的问题中提供的link 扩展代码示例:

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 实现为UnitKeep.right 表示要保留poolClientFlow 实现的HostConnectionPool。在.toMat 函数中,Keep.both 表示要使左侧池与流保持一致,而右侧 Future 则与Sink 保持一致。

【讨论】:

  • 非常感谢您的回答,toMat()(Keep.both) 绝对有帮助。但是,如果我想在运行流的代码中不在同一位置访问池怎么办?这样做是否有意义: Source.empty.viaMat(poolClientFlow)(Keep.right).to(Sink.ignore).run() 只是为了访问池?我猜在一般情况下,每个流都可以具体化到不同的实例,但在这里,它是同一个共享池......
  • @Yardena 欢迎您。我从未尝试在流的上下文之外访问物化池。为此,您可以简单地使用与 Http.newHostConnectionPool 设置相同的设置调用 HostConnectionPool 构造函数。这应该返回相同的实例,但我不想把它放在我的答案中,因为我以前从未尝试过。快乐的黑客攻击。
  • 再次感谢,我想我会坚持使用 Http().shutdownAllConnectionPools()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 2021-09-08
  • 2015-07-31
  • 2020-02-20
相关资源
最近更新 更多