我有一个分组元素的源和一个发出批量请求的接收器,
我使用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()
有没有办法清除'关机发生时不完整的批次?
答案 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()