ActiveMQ事务与异常回滚
ActiveMQ中的事务处理:
1. 事务性会话创建:
要使用事务,首先要创建一个事务性会话。在ActiveMQ中,通过调用Connection.createSession(true, Session.SESSION_TRANSACTED)
方法创建一个事务会话。第一个参数为true
表示创建事务性会话。
Connection connection = ...; // 创建连接
Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
2. 消息生产和消费:
在事务性会话中,可以发送或接收消息,这些操作不会立即生效,而是等待事务的提交或回滚。
- 消息生产:使用
send()
方法发送消息,这些消息会暂存在会话缓存中,等待事务提交。
MessageProducer producer = session.createProducer(destination);
TextMessage message1 = session.createTextMessage("Message 1");
TextMessage message2 = session.createTextMessage("Message 2");
// 发送消息,但此时并未真正投递给消息队列
producer.send(message1);
producer.send(message2);
- 消息消费:使用
receive()
方法接收消息,接收到的消息也仅在会话缓存中,不被认为是已消费的。
MessageConsumer consumer = session.createConsumer(destination);
Message msg = consumer.receive();
// 消费消息,但此时消息尚未被确认,待事务提交才正式从队列中移除
processMessage(msg);
3. 事务提交与回滚:
- 提交事务:当消息的生产和消费都成功时,调用
session.commit()
方法,会把会话缓存中的所有消息一起提交,这时消息才真正从生产者发送出去或从消费者那里得到确认。
session.commit();
- 回滚事务:若在处理消息过程中发生了异常,如业务逻辑错误或其他运行时异常,调用
session.rollback()
方法则会撤销整个事务,之前缓存的所有消息都将退回,生产者发送的消息会重新出现在队列中,消费者接收但未确认的消息也会重新变得可见。
try {
// 消息处理逻辑
...
session.commit();
} catch (Exception e) {
session.rollback();
// 错误处理逻辑
}
4. 异常与回滚:
在ActiveMQ中,无论是编译时异常(checked exceptions)还是运行时异常(unchecked exceptions),只要它们在事务性会话中未被捕获并处理,都会导致当前事务的回滚。
因此,对于运行时异常,开发者无需特别关注其与事务的关系,只需确保异常未在业务逻辑中被“吃掉”,就可以依靠事务的自动回滚机制来保证消息的一致性。
或者显示的抛出RuntimeException异常。 让mq知道要回滚。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!