了解NotUsed和Done

时间:2017-10-24 16:27:20

标签: scala akka akka-stream

我很难理解Akka Streams中NotUsedDone的目的和意义。

让我们看看以下两个简单的例子:

使用NotUsed:

implicit val system = ActorSystem("akka-streams")
implicit val materializer = ActorMaterializer()

val myStream: RunnableGraph[NotUsed] =
  Source.single("stackoverflow")
  .map(s => s.toUpperCase())
  .to(Sink.foreach(println))

val runResult:NotUsed = myStream.run()

使用完成

implicit val system = ActorSystem("akka-streams")
implicit val materializer = ActorMaterializer()

val myStream: RunnableGraph[Future[Done]] =
  Source.single("stackoverflow")
  .map(s => s.toUpperCase())
  .toMat(Sink.foreach(println))(Keep.right)

val runResult: Future[Done] = myStream.run()

当我运行这些示例时,在两种情况下都得到相同的输出:

STACKOVERFLOW //output

那么NotUsed和Done究竟是什么?有什么区别,什么时候我应该优先于另一个呢?

1 个答案:

答案 0 :(得分:5)

首先,您所做的选择介于NotUsedFuture[Done]之间(不只是Done)。

现在,您实际上是通过使用不同的组合器(totoMatKeep.right)来确定图表的具体化值。 物化值是一种在流运行时与流进行交互的方式。此选择不会影响流处理的数据,因此在两种情况下都会看到相同的输出。相同的元素(字符串“stackoverflow”)遍历两个流。

选择取决于运行流后主程序应该执行的操作:

  • 如果您对与其进行交互不感兴趣,NotUsed是正确的选择。它只是一个虚拟对象,它传达的信息是不允许也不需要与流进行交互
  • 如果您需要侦听流的完成以执行其他操作,则需要公开Future[Done]。这样您就可以使用(例如)onCompletemap附加回调。