Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何从广播的Akka流中获取订阅者和发布者?_Scala_Akka Stream_Reactive Streams - Fatal编程技术网

Scala 如何从广播的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

在使用更复杂的图形时,我在让发布者和订阅者退出流方面遇到了问题。我的目标是提供发布者和订阅者的API,并在内部运行Akka流媒体。这是我的第一次尝试,效果很好

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用户群中发布了一条消息,但到目前为止还没有运气。