簡體   English   中英

在 Akka Streams Sink 之后獲取原始元素的參考?

[英]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函數導致CommittableReadResultWriteMessage ,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM