RabbitMQ 事务机制

存在一个问题:当生产者将消息发送出去之后,如何去确认消息到底有没有到达服务器。

  1. 通过事务机制实现:
  2. 通过发送方确认(publisher confirm )机制实现。

这边先介绍事务机制。

  • 相关的方法有三个: channel.txSelect;channel.txCommit和channel.txRollback
  • 在发送消息前开启事务:channel.txSelect;
  • 消息发送之后提交事务:channel.txCommit;
  • 发生异常组要回滚:channel.txRollback

模型图

  1. 客户端发送Tx.Select. 将信道置为事务模式;
  2. Broker 回复Tx. Select-Ok. 确认己将信道置为事务模式:
  3. 在发送完消息之后,客户端发送Tx.Commit 提交事务;
  4. Broker 回复Tx. Commi t-Ok. 确认事务提交
    在这里插入图片描述
    代码:
try {
            channel.txSelect();
            channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY,false, properties, message.getBytes());
            channel.txCommit();
        } catch (Exception e) {
            e.printStackTrace();
            channel . txRollback();
        }

事务回滚:当发生异常未能执行channel.txCommit();执行channel . txRollback();即可回滚
模型图:
在这里插入图片描述

try {
            channel.txSelect();
            channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY,false, properties, message.getBytes());
			int i = 1/0;
            channel.txCommit();
        } catch (Exception e) {
            e.printStackTrace();
            channel . txRollback();
        }

1.发送多条消息时,只要用channel.txSelect();channel.txCommit();将发送消息包裹起来即可
2.只有消息成功被RabbitMQ 接收,事务才能提交成功,否则便可在捕获异常之后进行事务回滚,与此同时可以进行消息重发。
3.但是使用事务机制会"吸干" RabbitMQ所以RabbitMQ提供了一个改进方案,即发送方确认机制。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值