rabbitmq学习笔记8 : 事务管理

本文介绍了RabbitMQ中的事务管理,包括AMQP事务和Confirm事务模式。AMQP事务提供了txSelect(), txCommit(), txRollback()方法进行事务操作。Confirm模式下,消息发布后会得到broker的确认,生产者可以通过同步或异步方式监听确认状态,实现事务的自动提交或回滚。文章详细讲解了同步和异步Confirm模式的实现,并阐述了deliveryTag和multiple的使用策略。" 125139624,12408433,Linux环境下MySQL的详细安装指南,"['Linux', 'MySQL', '服务器', '数据库管理']
摘要由CSDN通过智能技术生成

一、概念

Rabbitmq的事务是针对于发送端来说的,有两种事务机制,一种是AMQP事务,另一种是将channel设置成confirm事务模式(同步和异步两种)。

二、AMQP事务

  1. AMQP提供三个方法进行事务管理,分别是txSelect()用于设置事务、txCommit()用于提交事务、txRollback()用于回滚事务
  2. 代码实现(基于简单队列做例子)
  • 创建MQ连接工具类
public class RabbitmqUntil {
    //获取连接
    public static Connection getRabbitmqConnection() throws Exception{
        //定义连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置服务地址
        factory.setHost("127.0.0.1");
        //设置端口(这里的端口号指定是AMQP协议所用的端口号)
        factory.setPort(5672);
        //设置数据库
        factory.setVirtualHost("/test");
        //设置用户名
        factory.setUsername("test");
        //设置密码
        factory.setPassword("test");
        return factory.newConnection();
    }
}
  • 消息发送者(设置事务)
public class AmqpSender {
    //队列名称
    final static String QUEUE_NAME =  "amqp queue";

    public static void sendMessage(String message)throws Exception{
        //获取连接
        Connection rabbitmqConnection = RabbitmqUntil.getRabbitmqConnection();
        //获取管道
        Channel channel = rabbitmqConnection.createChannel();
        /**
         * 队列创建(如果队列存在,则不进行创建)
         * 参数1:队列名
         * 参数2:是否支持持久化,默认队列在内存中,重启会丢失。设置为true,会保存到erlang自带的数据库中
         * 参数3:当连接关闭后是否自动删除队列;是否私有队列,如果私有,其他通道不能访问当前队列
         * 参数4:当没有消费者,是否自动删除队列
         * 参数5:其他参数(通过BasicProperties进行传输)
         */
        channel.queueDeclare(QUEUE_NAME,true,false,false,null);
        //设置事务
        channel.txSelect();
        try{
            //发布消息
            channel.basicPublish("",QUEUE_NAME,null,message.getBytes());

  //休眠5秒
  Thread.sleep(5000);
            //提交事务
            channel.txCommit();
        }catch (Exception e){
            //事务回滚
            channel.txRollback();
        }finally {
            //关闭资源
            channel.close();
            rabbitmqConnection.close();
        }
    }

    public static void main(String[] args)throws Exception {
        AmqpSender.sendMessage("hello I am amqp transaction");
    }
}

   注:该事务进行也可以进行批处理

  • 消息接收者(跟之前消息接收者没啥区别)
public class AmqpReceiver {
    //队列名称
    final static String QUEUE_NAME =  "amqp queue";

    public static void receiveMessage() throws Exception{
        //获取连接
        Connection rabbitmqConnection =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值