ActiveMQ 5.14.2.1配置redeliveryPolicy不生效该如何解决?
问题根源
你遇到的配置不生效问题,核心是ActiveMQ的重发策略生效逻辑分两种场景:
- 客户端侧触发的重发(比如你调用
session.rollback()、客户端消费超时未ACK)默认走客户端连接工厂内置的重发策略,服务端redeliveryPlugin默认不处理这类场景 - 只有服务端触发的重发(比如broker事务回滚、持久化消息broker重启后恢复重发)才会直接走服务端配置的
redeliveryPlugin策略
同时你当前的activemq.xml存在配置错误:redeliveryPlugin下重复嵌套了两层<amq:redeliveryPolicyMap>,属于无效结构,即使触发服务端重发也不会生效。
解决方案
方案一:直接配置客户端重发策略(推荐,适配你当前的回滚场景)
你使用Spring JMS,直接在客户端的ActiveMQ连接工厂中注入自定义重发策略即可,示例配置如下:
<!-- 自定义重发策略 --> <bean id="customRedeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy"> <property name="maximumRedeliveries" value="20"/> <property name="useExponentialBackOff" value="true"/> <property name="initialRedeliveryDelay" value="1000"/> <property name="redeliveryDelay" value="2000"/> <property name="maximumRedeliveryDelay" value="600000"/> </bean> <!-- 将重发策略注入连接工厂 --> <bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="你的ActiveMQ服务地址"/> <property name="redeliveryPolicy" ref="customRedeliveryPolicy"/> </bean>
如果是JavaConfig配置,对应写法如下:
@Bean public RedeliveryPolicy customRedeliveryPolicy() { RedeliveryPolicy policy = new RedeliveryPolicy(); policy.setMaximumRedeliveries(20); policy.setUseExponentialBackOff(true); policy.setInitialRedeliveryDelay(1000); policy.setRedeliveryDelay(2000); policy.setMaximumRedeliveryDelay(600000); return policy; } @Bean public ActiveMQConnectionFactory activeMQConnectionFactory() { ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("你的ActiveMQ服务地址"); factory.setRedeliveryPolicy(customRedeliveryPolicy()); return factory; }
配置完成后重启Tomcat应用即可生效。
方案二:统一由服务端管控所有重发策略
如果你希望所有客户端的重发逻辑都由broker统一配置,不需要每个客户端单独修改,按以下步骤操作:
- 修正服务端
activemq.xml的redeliveryPlugin配置,删除多余的嵌套层,正确配置如下:
<amq:redeliveryPlugin fallbackToDeadLetter="true" sendToDlqIfMaxRetriesExceeded="true"> <amq:redeliveryPolicyMap> <amq:defaultEntry> <amq:redeliveryPolicy maximumRedeliveries="20" useExponentialBackOff="true" initialRedeliveryDelay="1000" redeliveryDelay="2000" maximumRedeliveryDelay="600000"/> </amq:defaultEntry> </amq:redeliveryPolicyMap> </amq:redeliveryPlugin>
确认broker节点的schedulerSupport="true"配置无误后重启ActiveMQ服务。
- 在所有客户端的ActiveMQ连接配置中添加两个参数,关闭客户端侧重发,把重发控制权交给服务端:
- 将
maximumRedeliveries设为0,关闭客户端本地重发 - 开启
watchTopicAdvisories=false,让客户端回滚的消息直接返回broker处理
示例连接地址写法:tcp://你的broker地址:61616?jms.watchTopicAdvisories=false&jms.maximumRedeliveries=0
配置完成后重启客户端应用即可生效。
内容的提问来源于stack exchange,提问作者fool4jesus
相关产品推荐
相关产品推荐

