[英]Akka Streams - How to keep materialized value of an auxiliary Sink in a Graph
I have a function returning a Flow
whose logic involves passing some elements of the graph to an auxiliary Sink
passed as a parameter. 我有一个返回
Flow
的函数,其逻辑涉及将图的一些元素传递给作为参数传递的辅助Sink
。 I want to retain the auxiliary Sink
's materialized value so I'm able to act upon its value when the constructed stream is launched. 我想保留辅助
Sink
的物化值,这样我就可以在构造流启动时对其值进行操作。
Here's a rough picture of the flow I'm building: 这是我正在建设的流程的粗略图片:
IN ~> (logic: In => Out) ~> Broadcast ~> AuxFilter ~> AuxSink
~> OutFilter ~> OUT
Sample code: 示例代码:
case class Incoming()
trait Element
case class Outcoming() extends Element
case class Persistent() extends Element
def flow[Mat](auxSink: Sink[Persistent, Mat]): Flow[Incoming, Outcoming, NotUsed] = {
val isPersistent = Flow[Element].collect {
case persistent: Persistent => persistent
}
val isRunning = Flow[Element].collect {
case out: Outcoming => out
}
val magicFlow: Flow[Incoming, Element, NotUsed] = Flow[Incoming]
.map(_ => if (Random.nextBoolean()) Outcoming() else Persistent())
Flow.fromGraph {
GraphDSL.create() { implicit b =>
import GraphDSL.Implicits._
val magic = b.add(magicFlow)
val bcast = b.add(Broadcast[Element](2))
val sink = b.add(isRunning)
bcast.out(0) ~> isPersistent ~> auxSink
magic.out ~> bcast.in
bcast.out(1) ~> isRunning ~> sink.in
FlowShape(magic.in, sink.out)
}
}
}
Is there a way to somehow pass the auxSink
's Mat
to the resulting Flow
? 有没有办法以某种方式将
auxSink
的Mat
传递给最终的Flow
?
Thanks. 谢谢。
Answering my own question... 回答我自己的问题......
Found it! 找到了! The source of
Flow.alsoToMat
pointed me to exactly the logic I needed - to access the materialized value of an auxiliary graph (in my case auxSink
), one has to import its shape into the graph being constructed by passing it as a parameter to GraphDSL.create()
. Flow.alsoToMat
的源Flow.alsoToMat
指向了我所需的逻辑 - 访问辅助图形的物化值(在我的案例中为auxSink
),必须通过将其作为参数传递给GraphDSL.create()
将其形状导入到构造的图形中GraphDSL.create()
。
def flow[Mat](auxSink: Sink[Persistent, Mat]): Flow[Incoming, Outcoming, Mat] = {
val isPersistent = ...
val isRunning = ...
val magicFlow = ...
Flow.fromGraph {
GraphDSL.create(auxSink) { implicit b => aux =>
import GraphDSL.Implicits._
val magic = b.add(magicFlow)
val bcast = b.add(Broadcast[Element](2))
val sink = b.add(isRunning)
magic ~> bcast ~> isPersistent ~> aux
bcast ~> isRunning ~> sink
FlowShape(magic.in, sink.out)
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.