JmsTemplate发消息到ActiveMQ Artemis报AMQ219007但原生JMS正常
问题排查与修复方案
以下是针对配置问题的修复项,按优先级排序:
- 配置CachingConnectionFactory包装原始连接工厂
SpringJmsTemplate默认每次发送消息都会独立创建、销毁连接、会话和生产者,而你直接用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即可,连接会被复用避免重复创建冲突。
删除冲突的会话配置
JMS规范规定,当会话开启事务(sessionTransacted="true")时,确认模式会被强制设置为SESSION_TRANSACTED,你额外配置的sessionAcknowledgeModeName="CLIENT_ACKNOWLEDGE"是无效且会引发底层实现异常的,直接删除该配置项即可。修正目标解析器的错误引用
你后续添加的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
相关产品推荐
相关产品推荐

