我正在尝试了解邮件在处理过程中的行为。我的测试程序中有以下流程设置。
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
非常感谢任何见解。 谢谢
答案 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:queue.start
也不会被取消。当然,其原因是JMS经纪人不可能/不允许取消正在进行的消息消费。我们必须忍受这一点并在DLQ处理器中做出相应的反应。