如何在每条消息成功发送到JMS或失败后进行回调?
val jmsSink = JmsSink.textSink(
JmsSinkSettings(connectionFactory).withQueue("My_Queue")
)
Source(Stream.from(1))
.map(_.toString)
.runWith(jmsSink)
更具体的例子
// creating a sourceQueue which is bound to jmsSink
val sourceQueue: SourceQueueWithComplete[String] =
Source.queue[String](bufferSize, OverflowStrategy.backpressure)
.to(jmsSink)
.run()
客户正在将项目发送到sourceQueue
:
val result: Future[QueueOfferResult] = sourceQueue offer "my-item"
val result
是将项目插入sourceQueue
的结果,它并不意味着它已发送到JMS。我需要在项目经过接收器进程时触发事件,并插入到JMS队列。
答案 0 :(得分:1)
为每个成功的消息调用回调的一种方法(如果通过"回调"你的意思是一个返回Unit
的函数)是创建一个对应的Source
订阅相同的JMS队列,并使用runForeach
:
val jmsSink = JmsSink.textSink(
JmsSinkSettings(connectionFactory).withQueue("My_Queue")
)
Source(...)
.map(_.toString)
.runWith(jmsSink)
val jmsSource = JmsSource(
JmsSourceSettings(connectionFactory).withQueue("My_Queue")
)
jmsSource.runForeach(println)
以上示例打印通过接收器发布到队列的每条消息。
对于错误,如果抛出异常,当前您的流将关闭。例如,如果出现抛出异常,您希望打印异常并恢复流而不是终止它,则可以将supervision strategy附加到原始Source
:
val decider: Supervision.Decider = {
case e: Exception =>
println(s"Exception thrown: ${e.getMessage}")
Supervision.Resume
}
val flow = Flow[String]
.withAttributes(ActorAttributes.supervisionStrategy(decider))
Source(...)
.map(_.toString)
.via(flow)
.runWith(jmsSink)
val jmsSource = ...