[英]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.