Camel,Akka,JMS和延期消息确认:我可以向经纪人确认以前处理过的消息吗?

时间:2016-03-24 09:53:51

标签: scala jms akka activemq akka-camel

我正在使用Akka(最新的稳定版),akka-camel和JMS(为了这个对话的目的,让我们说它的ActiveMQ,但理想情况下解决方案应该是通用的)。

用例

我有以下用例。在队列Q上,我收到如下消息:

time:   1     2    3    4    5    6

      | A1 | B1 | C1 | C2 | A2 | B2 | .... 
         ^                        ^
       first                     latest

我的最终目标是在(A1,A2)(B1,B2)中将它们组合在一起,等等;尽管存在重复和未传递消息等复杂问题,但复杂的是我必须确保在整个对匹配并处理之前,代理将保留所有未确认的消息。

实施例

4我收到并处理了4条消息,并成功处理了对(C1, C2),但我仍然无法向代理确认任何内容,因为A1B1仍在不匹配和待定,并且在JMS中确认C2表示确认最多C2 的所有邮件。事实上,我收到的第一个确认是5,当收到A2时:此时我可以确认A1(并且只有A1 ,因为B1仍未决定。)

问题

现在,我似乎无法弄清楚如何通过akka-camel执行此类延迟异步确认。我一直在线阅读,虽然我可以找到有关如何手动确认消息的解释(docsexample),但没有任何内容显示如何向经纪人确认以前处理过的消息。

import akka.camel.{ CamelMessage, Consumer }
import akka.camel.Ack
import akka.actor.Status.Failure

class Consumer3 extends Consumer {
  override def autoAck = false

  def endpointUri = "jms:queue:test"

  def receive = {
    case msg: CamelMessage =>
      sender() ! Ack
      // on success
      // ..
      val someException = new Exception("e1")
      // on failure
      sender() ! Failure(someException)
  }
}

在这种情况下,Ackobject,其语义只是:我确认当前消息,而我需要像消息X一样现已确认,其中 X 是之前的消息,但不一定是当前消息。

这个用例是通过akka-camel支持还是可支持的,还是我自己构建它?

由于

1 个答案:

答案 0 :(得分:2)

听起来你想要的是activemq' s ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE

可悲的是,INVIDUAL_ACKNOWLEDGE不是JMS规范的一部分,但根据this帖子的说法,它在每个队列的基础上被广泛采用。 (我还没有实际检查过)

由于它不符合规范,akka并不支持开箱即用,但它确实会做出很好的贡献!