Akka Stream - Source.fromPublisher

时间:2016-04-15 16:13:15

标签: scala playframework akka akka-stream

我尝试根据akka流程快速入门指南执行以下代码:

implicit val system = ActorSystem("QuickStart")
implicit val materializer = ActorMaterializer()

val songs = Source.fromPublisher(SongsService.stream)

val count: Flow[Song, Int, NotUsed] = Flow[Song].map(_ => 1)

val sumSink: Sink[Int, Future[Int]] = Sink.fold[Int, Int](0)(_ + _)

val counterGraph: RunnableGraph[Future[Int]] =
  songs
    .via(count)
    .toMat(sumSink)(Keep.right)

val sum: Future[Int] = counterGraph.run()

sum.foreach(c => println(s"Total songs processed: $c"))

这里的问题是未来永远不会返回结果。与文档示例的最大区别是我的源代码。

我有一个播放枚举器,我将其转换为Akka Publisher,从而产生了这个SongsService.stream

将定义列表用作源时:

val songs = Source(list)

它可以工作,但是使用Source.fromPublisher不会。

但这里的问题确实不是出版商,我可以做一个简单的操作而且有效:

val songs = Source.fromPublisher(SongsService.stream)
songs.runForeach(println)

它通过数据库,创建播放枚举器,将其转换为发布者,我可以迭代。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

您的出版商可能永远不会完成。