Spring Boot集成ActiveMQ时Redelivery Policy配置不生效问题
问题根因
你自定义的DefaultJmsListenerContainerFactory未开启会话事务配置,导致消息到达监听器后自动确认,即使方法抛出异常也不会触发重发流程。
当你注释掉自定义的jmsListenerContainerFactory Bean时,Spring Boot会使用自动装配的默认监听容器工厂,该工厂默认开启会话事务支持,因此你配置的RedeliveryPolicy可以正常生效。
修复方案
修改你的jmsListenerContainerFactory Bean配置,新增setSessionTransacted(true)配置项即可,修改后代码如下:
@Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() throws Throwable { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(activeMQConnectionFactory()); factory.setMessageConverter(jacksonJmsMessageConverter()); factory.setConcurrency(env.getProperty("jms.connections.concurrent")); // 新增配置:开启会话事务,方法抛出异常时事务回滚触发消息重发 factory.setSessionTransacted(true); return factory; }
补充验证点
- 确认配置文件中
jms.redelivery.maximum配置值正确,无类型不匹配问题 - 如果不需要事务控制,也可以将应答模式设置为
CLIENT_ACKNOWLEDGE,手动控制消息确认时机,同样可以触发重发逻辑
内容的提问来源于stack exchange,提问作者amitabh pandey
相关产品推荐
相关产品推荐

