簡體   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