Spring JMS 5.3.6:XML配置replyQosSettings设置响应消息TTL无效
解决Spring JMS 5.3.6 XML配置下响应消息TTL不生效的问题
你的核心问题是对<jms:listener-container>的factory-id属性理解有误:这个属性的作用是将当前容器配置注册为一个工厂供@JmsListener注解使用,而非引用你已定义的JmsListenerContainerFactory。因此你配置的replyQosSettings根本没被实际的消息容器加载,自然不会生效。
下面提供两种可行的解决方案:
方案一:全局给listener容器配置响应QoS
直接在<jms:listener-container>中注入replyQosSettings,所有该容器下的listener都会复用这个配置:
<bean id="replyQosSettings" class="org.springframework.jms.support.QosSettings"> <constructor-arg name="deliveryMode" value="1"/> <constructor-arg name="priority" value="4"/> <constructor-arg name="timeToLive" value="300000"/> </bean> <jms:listener-container connection-factory="connectionFactory"> <!-- 直接给容器设置响应QoS参数 --> <property name="replyQosSettings" ref="replyQosSettings"/> <jms:listener destination="starter.load" ref="starterJmsListener" method="startLoad" concurrency="3" selector="destinationServer = '${hub.name}' OR destinationServer IS NULL"/> <jms:listener destination="starter.isLoadRunning" ref="starterJmsListener" method="isRunning" selector="destinationServer = '${hub.name}' OR destinationServer IS NULL"/> </jms:listener-container>
方案二:给单个listener配置响应QoS
如果需要给不同的listener设置不同的TTL等参数,可以通过<jms:adapter>为每个listener单独配置:
<bean id="replyQosSettings" class="org.springframework.jms.support.QosSettings"> <constructor-arg name="deliveryMode" value="1"/> <constructor-arg name="priority" value="4"/> <constructor-arg name="timeToLive" value="300000"/> </bean> <jms:listener-container connection-factory="connectionFactory"> <jms:listener destination="starter.load" ref="starterJmsListener" method="startLoad" concurrency="3" selector="destinationServer = '${hub.name}' OR destinationServer IS NULL"> <jms:adapter> <property name="replyQosSettings" ref="replyQosSettings"/> </jms:adapter> </jms:listener> <jms:listener destination="starter.isLoadRunning" ref="starterJmsListener" method="isRunning" selector="destinationServer = '${hub.name}' OR destinationServer IS NULL"> <jms:adapter> <property name="replyQosSettings" ref="replyQosSettings"/> </jms:adapter> </jms:listener> </jms:listener-container>
额外注意事项
- 确保你的监听方法有返回值:Spring只会将方法返回值包装成响应消息发送,无返回值的方法不会触发响应消息逻辑
- 确认你的JMS提供者(如ActiveMQ、IBM MQ等)支持TTL设置,部分老旧或特殊的消息中间件可能需要额外配置
内容的提问来源于stack exchange,提问作者Waldi
相关产品推荐
相关产品推荐

