Akka流 - 关闭流并进行分组而不会丢失数据

时间:2017-09-29 08:40:01

标签: scala akka-stream

我有一个分组元素的源和一个发出批量请求的接收器, 我使用KillSwitch能够在任意时间点关闭图形。在调用switch.shutdown()时,源输出的最新未完成批次记录的问题

val source = Source.tick(10.millis, 10.millis, "tick").grouped(500)

val (switch, _) = source.viaMat(KillSwitches.single)(Keep.right)
.toMat(sink)(Keep.both).run()

Thread.sleep(3000) // wait some arbitrary time

switch.shutdown()

有没有办法清除'关机发生时不完整的批次?

1 个答案:

答案 0 :(得分:3)

kill开关关闭的行为是位置的,根据其文档

  

调用[[UniqueKillSwitch #shutdown()]]之后的运行实例   物化到的[[FlowShape]]的[[Graph]]   [[UniqueKillSwitch]]将完成其下游并取消它   上游(除非完成或失败已经在这种情况下   命令被忽略)。

另请参阅更多文档here

现在grouped阶段仅在完成时发出部分填充的组,但在取消时不会。

这意味着下面的图表(在 killswitch之前分组)将表现得像您观察到的那样

  val switch = 
    Source.tick(10.millis, 175.millis, "tick")
          .grouped(10)
          .viaMat(KillSwitches.single)(Keep.right)
          .toMat(Sink.foreach(println))(Keep.left)
          .run()

虽然下图(在 killswitch之后分组)将在完成时向下游发出部分组

  val switch =
    Source.tick(10.millis, 175.millis, "tick")
          .viaMat(KillSwitches.single)(Keep.right)
          .grouped(10)
          .toMat(Sink.foreach(println))(Keep.left)
          .run()