ActiveMQ / Camel消息在处理时到期时的行为

时间:2014-04-11 23:30:04

标签: jms apache-camel activemq

我正在尝试了解邮件在处理过程中的行为。我的测试程序中有以下流程设置。

queue.start - > sleepProcessor - > queue.end

sleepProcessor从queue.start获取消息并休眠5秒钟。我从System.currentTimeMillis()发送消息到queue.start,JMSExpiration为1秒。我为每个名为DLQ.queue.start和DLQ.queue.end的队列设置了死信队列。

我看到的行为是,1条消息在DLQ.queue.start中结束,另一条消息在DLQ.queue.end中结束。 1条消息如何成为2?

测试程序可以在这里找到源

http://s000.tinyupload.com/?file_id=04225732819763428273

我已经包含了一个maven pom.xml,可以使用以下命令运行测试程序

mvn camel:run

OS:Linux 3.5.0(Mint 14)

JVM:1.6

ActiveMQ:5.7.0

骆驼:2.8.2

非常感谢任何见解。 谢谢

1 个答案:

答案 0 :(得分:0)

对于讨论,我认为显示代码的所有重要部分非常有用。

您的路线如下:

from("jms:queue.start")
    .transacted()
    .process(sleepProcessor)
    .to("jms:queue.end");

标题设置如下:

final Map<String, Object> headers = new HashMap<String, Object>();
final long expiration = System.currentTimeMillis() + 1000;  // <-- start time plus 1 second!
headers.put("JMSExpiration", expiration);

最后,处理开始如下:

final ProducerTemplate template = camelContext.createProducerTemplate();
template.sendBodyAndHeaders("jms:queue.start", "Test message", headers);

处理过程中发生的事情:

  • 路由已启动且邮件已发送至jms:queue.start且过期时间设置为1秒
  • jms:queue.start路由收到消息,sleepProcessor等待5秒。请注意,尚未向JMS代理发送确认(仅在Camel路由结束时确认消息)。在此期间,邮件已过期,我们会看到DLQ处理器生成的第一个日志。
  • 之后,邮件将发送到jms:queue.end。邮件标题JMSExpriation表示邮件已过期(&gt;开始时间加5秒),邮件已立即过期,我们会看到DLQ生成的第二个日志处理器看起来是重复的消息。

结论:

  • 即使JMS消息在处理期间过期,路由jms:queue.start也不会被取消。当然,其原因是JMS经纪人不可能/不允许取消正在进行的消息消费。我们必须忍受这一点并在DLQ处理器中做出相应的反应。