【问题标题】:Programmatically disable ActiveMQ message redelivery以编程方式禁用 ActiveMQ 消息重新传递
【发布时间】:2017-07-13 12:18:44
【问题描述】:

当消费者无法处理并调用会话回滚时,我需要禁用消息重新传递。目标是将消息保留在队列中而无需重新传递,并且我的后台消费者将继续尝试处理消息。

在 connection.getRedeliveryPolicy() 中,我看到了自定义重新交付延迟和其他设置的选项,但我没有看到任何完全禁用重新交付的选项。这甚至可能吗(最好以编程方式使用 connection.getRedeliveryPolicy() 属性,例如)

【问题讨论】:

    标签: activemq


    【解决方案1】:

    嗯,你可以做一些技巧。

    典型的方法是使用内置的 DLQ 功能,让您的回滚消息前往 DLQ。然后你可以有任何程序来尝试处理这些消息。

    但是如果你真的想保持队列上的回滚消息“原样”并且不被消费者多次触及,也是可以实现的。

    首先。将 max redeliveres 设置为 1,即消息将重试一次。

    ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
    RedeliveryPolicy policy = new RedeliveryPolicy();
    policy.setMaximumRedeliveries(1);
    cf.setRedeliveryPolicy(policy);
    

    然后确保只接收带有选择器的未重新传递的消息。

    MessageConsumer cons = sess.createConsumer(sess.createQueue("FOOBAR"), "JMSRedelivered <> true");
    

    要阅读回滚消息,您必须使用反向选择器阅读。无论如何,我仍然建议为回滚消息使用单独的队列,例如内置的 DLQ。更容易处理,更不容易出错。

    【讨论】:

      【解决方案2】:

      很遗憾,没有解决方案可以停用 RedeliveryPolicy,但您可以设计其他代码。

      看这里ActiveMQ redelivery does not work

      也许org.apache.activemq.ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE 可以帮助你,但请记住这一点:

      一旦代理发送了预取限制数量的消息到 消费者 它不会再向该消费者发送任何消息 直到消费者确认至少 50% 的预取 收到的消息,例如 prefetch/2。当经纪人有 收到所述确认,它将发送进一步的 prefetch/2 给消费者“充值”的消息数量,可以说,它的 预取缓冲区。请注意,可以指定预取限制 以每位消费者为基础(见下文)。

      另一种解决方案是将消息发送到后台消费者的另一个队列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-15
        • 2014-08-13
        • 2013-11-24
        相关资源
        最近更新 更多