从ActiveMQ Classic 5.7.0迁移到5.18.3后MessageProducer无法发消息
检查事务处理逻辑
旧版activemq-core包含Broker端逻辑,可能存在隐式事务提交的兼容处理;而activemq-client是纯客户端实现,严格遵循JMS规范。如果你的代码使用了事务性会话(Session.SESSION_TRANSACTED),必须在publisher.send()后显式调用session.commit()——未提交的事务会在会话关闭时自动回滚,这会导致消息发送失败且无异常抛出(回滚逻辑在后台执行,不会触发catch块)。若无需事务,直接将会话模式设为Session.AUTO_ACKNOWLEDGE或Session.CLIENT_ACKNOWLEDGE,同时确保连接工厂配置中transacted=false。排查EOFException根源
该异常说明客户端与Broker的连接意外断开,常见原因:- 协议版本不兼容:5.7.0与5.18.3的OpenWire协议版本存在差异,在连接URL后追加参数调整协议兼容,比如
?wireFormat.maxInactivityDuration=0(禁用空闲超时),或指定与Broker匹配的协议版本wireFormat.version=14(对应5.18.3的OpenWire版本)。 - 依赖冲突:使用
mvn dependency:tree(Maven)或gradle dependencies(Gradle)检查依赖树,排除所有间接引入的旧版activemq-core、activemq-broker等依赖,避免类加载冲突导致的通信异常。
- 协议版本不兼容:5.7.0与5.18.3的OpenWire协议版本存在差异,在连接URL后追加参数调整协议兼容,比如
验证JMS API兼容性
你引入了javax.jms-api 2.0.1,若代码仍使用JMS 1.1的API(Session、MessageProducer),需确保客户端配置兼容JMS 1.1:可在连接工厂中设置jms.useAsyncSend=false禁用异步发送,排查是否因异步逻辑吞掉了异常。同时确认Broker端(接收端)已启用JMS 2.0支持(5.18.3默认兼容,但可检查broker.xml中是否有相关限制配置)。开启DEBUG日志定位细节
将org.apache.activemq和javax.jms的日志级别设为DEBUG,查看客户端与Broker的交互全流程:包括连接建立、会话创建、消息发送、事务提交/回滚的具体步骤。DEBUG日志会明确输出事务回滚的触发原因,或连接断开的具体时机,帮助定位问题节点。梳理资源释放逻辑
原finally块可能存在提前关闭会话/连接的逻辑,导致send操作未完成就被中断,掩盖了底层异常。重新调整资源释放顺序:先关闭MessageProducer,再关闭Session,最后关闭Connection,每个步骤单独做异常捕获,避免因资源未正确释放引发的通信中断。
内容的提问来源于stack exchange,提问作者Francesco

