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知道要回滚。

原文链接 https://www.hanyuanhun.cn | https://node.hanyuanhun.cn

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值