了解NotUsed和Done

obl*_*ion 3 scala akka akka-stream

我有一个很难理解的目的和意义NotUsed,并Done在阿卡流.

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

使用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()
Run Code Online (Sandbox Code Playgroud)

使用完成

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()
Run Code Online (Sandbox Code Playgroud)

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

STACKOVERFLOW //output
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*tti 7

首先,你可以将这个选择之间NotUsedFuture[Done](不只是Done).

现在,你基本上是决定物化价值的图形,通过使用不同的组合程序(totoMatKeep.right).物化值是一种在流运行时与流进行交互的方式.此选择不会影响流处理的数据,因此在两种情况下都会看到相同的输出.相同的元素(字符串"stackoverflow")遍历两个流.

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

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