![](/img/trans.png)
[英]Akka Streams takeWhile processing next element even after condition fails
[英]Get reference of original element after Akka Streams Sink?
我正在嘗試使用 Amqp alpakka 連接器作為源和接收器。
Source<CommittableReadResult, NotUsed> AMQP_SOURCE
-> processAndGetResponse
-> Sink<ByteString, CompletionStage<Done>> AMQP_SINK
Sink的操作成功后,我想確認從Amqp隊列中獲取的消息。 像這樣:
amqp_source(committableReadResult)
-> processAndGetResponse
-> amqp_sink
-> IfSinkOperationSuccess.Then(committableReadResult.ack())
我怎樣才能做到這一點? 我基本上只想在接收器操作成功后才將消息標記為確認。
一般來說,如果你有一個Sink
實現了Future[Done]
(Scala API,我相信 Java 等價物是CompletionStage[Done]
),你可以在mapAsync
階段中使用該Sink
運行一個子流。 數據只有在成功時才會通過。
通過快速閱讀 Alpakka AMQP API, Sink
都以這種方式實現,因此該方法將起作用。
假設您的doSomethingWithMessage
函數導致CommittableReadResult
和WriteMessage
,Scala 中的以下內容將起作用:
def doSomethingWithMessage(in: CommittableReadResult): (CommittableReadResult, WriteMessage) = ???
amqpSource
.map(doSomethingWithMessage)
.mapAsync(parallelism) { tup =>
val (crr, wm) = tup
val fut = Source.single(crr, wm).runWith(amqpSink)
fut.flatMap(_ => crr.ack().map(_ => crr.message))
}.runWith(Sink.ignore)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.