繁体   English   中英

如果只有第一个接收器成功,则将元素发送到第二个接收器

[英]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(例如PairTry ),其中包含下一步所需的数据数据库操作的结果。

如果“不成功”的数据库操作意味着它会抛出异常,那么您肯定必须使用 Try。 因为如果数据库流抛出异常,stream就会停止。 如果数据库操作“不成功”是一个负面结果(例如,没有足够的操作信用,数据库中不存在产品代码,诸如此类),那么您可以使用包含数据库结果的对(可能只是一个布尔值)数据负载。 如果两者都是,您将不得不使用包含 Pair 的 Try,这样您就可以拦截异常情况和“计算机拒绝”业务逻辑情况。

然而这里的关键是,这是通过Flow而不是Sink完成的。 Sink 消耗数据。 流将同时使用和返回数据,这正是您想要的。

在数据库 Flow 的结果上,您在 stream 上放置一个filter()filterNot()以删除不成功的结果,然后将其传递到完成 API 调用的下游 Sink(或另一个 Flow)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM