ActiveMQ 主要支持两种事务处理模式:JMS 事务和 XA 事务。
JMS 事务基于 Session 对象的 commit() 和 rollback() 方法,行为类似于 JDBC 连接中的事务控制。而 XA 事务则涉及更复杂的分布式协调,客户端作为参与者与消息代理(Broker)进行通信,这就像 JDBC 连接在 XA 事务中与数据库交互一样。
在启用事务的 Session 中,生产者发送消息时会附带事务 ID。Broker 接收到消息后,会检查是否存在该 ID。若存在,消息会被暂存到事务存储区,等待最终的提交或回滚指令。这意味着 ActiveMQ 的事务状态实际上是由 Broker 维护的,而非仅仅依赖 Producer 端的状态。无论 Session 最终是否提交,消息都已经抵达了 Broker。
关于持久化消息的处理有个细节需要注意。当生产者配置为持久化模式时,若消息过期进入死信队列(DLQ),ActiveMQ 会在移动前剥离消息中的事务 ID。这样,过期的消息就不再受原事务约束,也不会再被保留在事务存储区中,而是直接转入死信队列。这一逻辑实现位于 org.apache.activemq.util.BrokerSupport 类的 doResend 方法中,代码里会将事务 ID 备份到 originalTransactionID 字段后再移除原始 ID。

