Scala 如何从广播的Akka流中获取订阅者和发布者?
在使用更复杂的图形时,我在让发布者和订阅者退出流方面遇到了问题。我的目标是提供发布者和订阅者的API,并在内部运行Akka流媒体。这是我的第一次尝试,效果很好Scala 如何从广播的Akka流中获取订阅者和发布者?,scala,akka-stream,reactive-streams,Scala,Akka Stream,Reactive Streams,在使用更复杂的图形时,我在让发布者和订阅者退出流方面遇到了问题。我的目标是提供发布者和订阅者的API,并在内部运行Akka流媒体。这是我的第一次尝试,效果很好 val subscriberSource = Source.subscriber[Boolean] val someFunctionSink = Sink.foreach(Console.println) val flow = subscriberSource.to(someFunctionSink) //create Reactiv
val subscriberSource = Source.subscriber[Boolean]
val someFunctionSink = Sink.foreach(Console.println)
val flow = subscriberSource.to(someFunctionSink)
//create Reactive Streams Subscriber
val subscriber: Subscriber[Boolean] = flow.run()
//prints true
Source.single(true).to(Sink(subscriber)).run()
但对于更复杂的广播图,我不确定如何将订阅者和发布者对象取出?我需要一个局部图吗
val subscriberSource = Source.subscriber[Boolean]
val someFunctionSink = Sink.foreach(Console.println)
val publisherSink = Sink.publisher[Boolean]
FlowGraph.closed() { implicit builder =>
import FlowGraph.Implicits._
val broadcast = builder.add(Broadcast[Boolean](2))
subscriberSource ~> broadcast.in
broadcast.out(0) ~> someFunctionSink
broadcast.out(1) ~> publisherSink
}.run()
val subscriber: Subscriber[Boolean] = ???
val publisher: Publisher[Boolean] = ???
调用
RunnableGraph.run()
时,流将运行,结果是该运行的“物化值”
在您的简单示例中,Source.subscriber[Boolean]
的物化值是subscriber[Boolean]
。在复杂的示例中,您希望将图形的多个组件的物化值组合为一个物化值,即元组(订阅者[Boolean],发布者[Boolean])
您可以通过将对其物化值感兴趣的组件传递给FlowGraph.closed()
,然后指定一个函数来组合物化值:
import akka.stream.scaladsl._
import org.reactivestreams._
val subscriberSource = Source.subscriber[Boolean]
val someFunctionSink = Sink.foreach(Console.println)
val publisherSink = Sink.publisher[Boolean]
val graph =
FlowGraph.closed(subscriberSource, publisherSink)(Keep.both) { implicit builder ⇒
(in, out) ⇒
import FlowGraph.Implicits._
val broadcast = builder.add(Broadcast[Boolean](2))
in ~> broadcast.in
broadcast.out(0) ~> someFunctionSink
broadcast.out(1) ~> out
}
val (subscriber: Subscriber[Boolean], publisher: Publisher[Boolean]) = graph.run()
看
(
Keep.both
都是函数的缩写(a,b)=>(a,b)
)谢谢您提供的信息性答案。让我扫兴的是Grapply的大小,它有点像怪物。也没有意识到签名def关闭[Mat,M1,M2](g1:Graph[Shape,M1],g2:Graph[Shape,M2])(combineMat:(M1,M2)⇒ Mat)(构建块:FlowGraph.Builder[Mat]⇒ (g1.形,g2.形)⇒ 单位):RunnableGraph[Mat]
具体化的值可能是我需要的元组。如果有人试图复制第二个示例代码,请注意:您需要使用fanoutPublisher而不是publisher来使其工作。我的猜测是,构建图表时不知何故使用了分配的一个订阅者插槽。@ripla您是否有使用fanoutPublisher
的工作示例?你的是我在互联网上找到的关于fanoutPublisher
的两篇参考文献之一,我正在尝试实现它,但没有一篇是关于实际代码示例的。我也在Akka用户群中发布了一条消息,但到目前为止还没有运气。