You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

额外注意事项

  1. 确保你的监听方法有返回值:Spring只会将方法返回值包装成响应消息发送,无返回值的方法不会触发响应消息逻辑
  2. 确认你的JMS提供者(如ActiveMQ、IBM MQ等)支持TTL设置,部分老旧或特殊的消息中间件可能需要额外配置

内容的提问来源于stack exchange,提问作者Waldi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 12:16:07