【问题标题】:ActiveMQ / Camel Behavior when a message expires while being processedActiveMQ / Camel 消息在处理过程中过期时的行为
【发布时间】:2014-04-12 19:49:17
【问题描述】:

我试图了解消息在处理过程中过期时的行为。我的测试程序中有以下流程设置。

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骆驼:运行

操作系统:Linux 3.5.0(Mint 14)

JVM:1.6

ActiveMQ:5.7.0

骆驼:2.8.2

任何见解将不胜感激。 谢谢

【问题讨论】:

    标签: jms apache-camel activemq


    【解决方案1】:

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

    您的路线如下所示:

    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 处理器生成的 first 日志。
    • 之后,邮件被发送到jms:queue.end。消息头JMSExpriation 表示消息已过期(> 开始时间加上 5 秒),消息立即过期,我们看到 DLQ 处理器生成的 second 日志看起来像消息重复。

    结论:

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

    【讨论】:

      猜你喜欢
      • 2019-02-14
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多