RabbitMQ的事务机制

想要保证发送者一定能把消息发送给RabbitMQ,一种是通过Confirm机制,另一种就是通过事务机制。

RabbitMQ的事务机制,允许生产者将一组操作打包成一个原子事务单元,要么全部执行成功,要么全部失败。事务提供了一种确保消息完整性的方法,但需要谨慎使用,因为他们对性能有一定的影响。

RabbitMQ是基于AMQP协议实现的,RabbitMQ中,事务是通过在通道(Channel)上启用的,与事务机制有关的方法有三个:

txSelstct():将当前channel设置成transaction模式。

txCommit():提交事务。

txRollback():回滚事务。

我们需要先通过txSelect开启事务,然后就可以发布消息给MQ了,如果txCommit提交成功了,则消息一定到达了RabbitMQ,如果在txCommit执行之前RabbitMQ实例异常崩溃或者抛出异常,那我们就可以捕获这个异常然后执行txRollback进行回滚事务。

所以,通过事务机制,我们也能保证消息一定可以发送给RabbitMQ。

以下,是一个通过事务发送消息的方法实例:

java 复制代码
package com.example.demo.rabbitmq;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class RabbitMQTransactionExample {
    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            //启用事务
            channel.txSelect();


            String exchangeName = "my_exchange";
            String routingKey = "my_routing_key";

            try {
                //发送第一条消息
                String message1 = "Transaction Message 1";
                channel.basicPublish(exchangeName, routingKey, null, message1.getBytes());


                //发送第二条消息
                String message2 = "Transaction Message 2";
                channel.basicPublish(exchangeName, routingKey, null, message2.getBytes());

                //模拟一个错误
                int x = 1 / 0;

                //提交事务(如果没有发生错误)
                channel.txCommit();
                System.out.println("Transaction committed.");

            } catch (Exception e) {
                //发生错误,回滚事务
                channel.txRollback();
                System.out.println("Transaction rolled back.");
            }
        }
    }
}
相关推荐
敏叔V5875 小时前
联邦学习与大模型:隐私保护下的分布式模型训练与微调方案
分布式
短剑重铸之日7 小时前
《7天学会Redis》特别篇: Redis分布式锁
java·redis·分布式·后端·缓存·redission·看门狗机制
重生之绝世牛码9 小时前
Linux软件安装 —— kafka集群安装(SASL密码验证)
大数据·linux·运维·服务器·分布式·kafka·软件安装
填满你的记忆9 小时前
【从零开始——Redis 进化日志|Day5】分布式锁演进史:从 SETNX 到 Redisson 的完美蜕变
java·数据库·redis·分布式·缓存
無森~10 小时前
ZooKeeper
分布式·zookeeper·云原生
小北方城市网10 小时前
SpringBoot 集成 MinIO 实战(对象存储):实现高效文件管理
java·spring boot·redis·分布式·后端·python·缓存
Blossom.11810 小时前
大模型分布式训练通信优化:从Ring All-Reduce到分层压缩的实战演进
人工智能·分布式·python·深度学习·神经网络·机器学习·迁移学习
码农水水10 小时前
得物Java面试被问:大规模数据的分布式排序和聚合
java·开发语言·spring boot·分布式·面试·php·wpf
爱吃提升11 小时前
分布式爬虫的核心原理详细介绍
分布式·爬虫
無森~11 小时前
Hadoop序列化与反序列化
大数据·hadoop·分布式