Alpakka - 处理消息时的回调

时间:2017-12-16 22:29:24

标签: scala jms akka-stream alpakka

如何在每条消息成功发送到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队列。

1 个答案:

答案 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 = ...