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

JmsTemplate发消息到ActiveMQ Artemis报AMQ219007但原生JMS正常

问题排查与修复方案

以下是针对配置问题的修复项,按优先级排序:

  1. 配置CachingConnectionFactory包装原始连接工厂
    Spring JmsTemplate 默认每次发送消息都会独立创建、销毁连接、会话和生产者,而你直接用JMS原生代码时会复用连接,这是两者行为差异的核心原因。
    你在连接URL中硬编码了固定clientID,JMS规范中同一个clientID不允许同时关联多个连接,JmsTemplate频繁创建销毁连接的逻辑会触发该限制导致连接失败。
    修改配置,添加CachingConnectionFactory:
<bean id="cachingArtemisConnectionFactory" 
      class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="artemisConnectionFactory"/>
    <property name="sessionCacheSize" value="10"/>
</bean>

然后将JmsTemplate的connectionFactory属性修改为引用cachingArtemisConnectionFactory即可,连接会被复用避免重复创建冲突。

  1. 删除冲突的会话配置
    JMS规范规定,当会话开启事务(sessionTransacted="true")时,确认模式会被强制设置为SESSION_TRANSACTED,你额外配置的sessionAcknowledgeModeName="CLIENT_ACKNOWLEDGE"是无效且会引发底层实现异常的,直接删除该配置项即可。

  2. 修正目标解析器的错误引用
    你后续添加的artemisDestinationResolver中,jndiTemplate引用的amqJndiTemplate不存在,你定义的JndiTemplate id是artemisJndiTemplate,修正为:

<bean id="artemisDestinationResolver"
        class="org.springframework.jms.support.destination.JndiDestinationResolver">
    <property name="jndiTemplate" ref="artemisJndiTemplate" />
    <property name="cache" value="true" />
</bean>

如果没有动态目的地解析需求,该配置也可以直接删除,你当前已经在JmsTemplate中配置了固定的defaultDestination,不需要额外的解析器。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:21:02