[英]Sending element to second sink if only first sink is successful
我想使用 akka 流进行以下操作。我试过广播,也尝试过,但它没有解决我的问题
来源 -> DBSink -> APISink。
我首先想将元素发送到数据库,当交易成功完成时,我想将它发送到 APISink ..如果交易在第一个 Sink 失败,我不想将它发送到 API ..
目前还不完全清楚你想要实现什么。
您可以使用alsoTo将元素从源发送到多个接收器。
将给定的 Sink 附加到此 Flow,这意味着通过此 Flow 的元素也将被发送到 Sink。
val sink1 = Sink.foreach[Int](_ => "got it at sink1")
val sink2 = Sink.foreach[Int](_ => "got it at sink2")
Source(List(1, 2, 3))
.alsoTo(sink1)
.to(sink2)
只有当它们都发出“需求”时,元素才会被发送到两个接收器。 这与Broadcast
的行为方式相同。
如果出现错误,即在 stream 处理中抛出异常,两个接收器都会收到错误通知,stream 默认停止。 stream 是否需要停止、重启或恢复是监管策略的问题。
.withAttributes(ActorAttributes.supervisionStrategy(Supervision.resumingDecider))
您将不得不使用Flow
进行数据库操作。 数据库流应返回某种组合 object(例如Pair
或Try
),其中包含下一步所需的数据和数据库操作的结果。
如果“不成功”的数据库操作意味着它会抛出异常,那么您肯定必须使用 Try。 因为如果数据库流抛出异常,stream就会停止。 如果数据库操作“不成功”是一个负面结果(例如,没有足够的操作信用,数据库中不存在产品代码,诸如此类),那么您可以使用包含数据库结果的对(可能只是一个布尔值)和数据负载。 如果两者都是,您将不得不使用包含 Pair 的 Try,这样您就可以拦截异常情况和“计算机拒绝”业务逻辑情况。
然而这里的关键是,这是通过Flow
而不是Sink
完成的。 Sink 消耗数据。 流将同时使用和返回数据,这正是您想要的。
在数据库 Flow 的结果上,您在 stream 上放置一个filter()
或filterNot()
以删除不成功的结果,然后将其传递到完成 API 调用的下游 Sink(或另一个 Flow)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.