仅针对消息容器的 ActiveMQ 重新传递策略

Posted

技术标签:

【中文标题】仅针对消息容器的 ActiveMQ 重新传递策略【英文标题】:ActiveMQ Redelivery Police only for a Message Container 【发布时间】:2015-07-31 19:41:17 【问题描述】:

在这段代码中,我试图仅为特定主题中的消息设置重新投递策略:

    RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
    emailByFolioRedeliveryPolicy.setInitialRedeliveryDelay(5000);
    emailByFolioRedeliveryPolicy.setRedeliveryDelay(5000);
    emailByFolioRedeliveryPolicy.setUseExponentialBackOff(false);
    emailByFolioRedeliveryPolicy.setBackOffMultiplier(10);
    emailByFolioRedeliveryPolicy.setMaximumRedeliveries(3);

    PooledConnectionFactory connPool = new PooledConnectionFactory();
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");

    RedeliveryPolicyMap redeliveryPolicyMap = connectionFactory.getRedeliveryPolicyMap();
    redeliveryPolicyMap.put(new ActiveMQTopic("VirtualTopic.firstTopic"), redeliveryPolicy );

    connPool.setConnectionFactory(connectionFactory);
    connPool.setCreateConnectionOnStartup(true);
    connPool.setMaxConnections(20);
    return connPool;

问题是发送到另一个主题 (VirtualTopic.secondTopic) 的消息也会受到此策略的影响,因为我可以看到第二个主题的侦听器正在处理重新传递的消息。在 RedeliveryPolicyMap 中,我添加了指定目标的策略。但由于某种原因,我无法让它按预期工作。

预期是:

一条新消息 A 已发布到“VirtualTopic.firstTopic” 一条新消息 B 已发布到“VirtualTopic.secondTopic” “VirtualTopic.firstTopic”上的侦听器“Consume.FIRST.VirtualTopic.firstTopic”将处理消息 A。 “VirtualTopic.secondTopic”上的侦听器“Consume.SECOND.VirtualTopic.firstTopic”将处理消息 B。 如果 FIRST 侦听器失败,将在 15 分钟后重试。 如果 SECOND 侦听器失败,则不会发生任何事情。该消息将最终进入死信队列。

我从这个页面获取了配置:

http://activemq.apache.org/redelivery-policy.html

有人做过这样的事情吗?谢谢。

【问题讨论】:

解决问题了吗? 【参考方案1】:

策略在 ActiveMQConnectionFactory 或 ActiveMQConnection 级别设置 - 如果您的策略不同,您需要在项目中相应地使用不同的连接工厂。在您提到的情况下,您需要使用自己的重新传递策略定义 2 个单独的 ActiveMQ 连接工厂。希望对你有帮助

【讨论】:

我们的可能解决方案列表中有这种方法。尝试该解决方案后,我会通知您。谢谢。 感谢您的帮助。我使用了两种不同的连接。第一个连接是我们过去使用的预先存在的连接。第二个是新的,这个正在与还送警察一起设置。 PooledConnectionFactory connPool = new PooledConnectionFactory(); ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); RedeliveryPolicyMap redeliveryPolicyMap = activeMQConnectionFactory.getRedeliveryPolicyMap(); redeliveryPolicyMap.setDefaultEntry(returnReDeveliveryPolicy()); 祝你好运!!

以上是关于仅针对消息容器的 ActiveMQ 重新传递策略的主要内容,如果未能解决你的问题,请参考以下文章

重新传递 Mule ESB 处理的失败的 activemq jms 消息时保留异常原因

ActriveMQ-消息重新传递和死信队列(DLQ)处理

ActiveMQ配置策略

MQJMS以及ActiveMQ

ActiveMQ(20):Consumer高级特性之重新投递(Redelivery Policy)

Html5 postMessage实现跨域消息传递