rabbitmq AMQP消息确认机制90_02

问题产生背景:

生产者发送消息出去之后,不知道到底有没有发送到RabbitMQ服务器, 默认是不知道的。而且有的时候我们在发送消息之后,后面的逻辑出问题了,我们不想要发送之前的消息了,需要撤回该怎么做。
这里涉及两个问题:

  1. rabbitmq消息确认
  2. rabbitmq消息事物

解决办法

  1. AMQP 事务机制
  2. Confirm 模式

事务模式:
txSelect 将当前channel设置为transaction模式
txCommit 提交当前事务
txRollback 事务回滚

代码

Producer

/**
 * FileName: Producer
 * Author:   wangxinqiao
 * Date:     2020/1/20 10:40 上午
 * Description: 消息队列事物生产者
 * History:
 */
public class Producer {
    private static final String QUEUE_NAME = "test_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        //连接
        Connection connection = MQConnectionUtils.newConnection();
        // 2.创建通道
        Channel channel = connection.createChannel();
        // 3.创建队列声明
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 将当前管道设置为 txSelect 将当前channel设置为transaction模式 开启事务
        channel.txSelect();
        String msg = "wangxinqiao";
        try {
            // 4.发送消息
            channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
            // int i = 1 / 0;
            channel.txCommit();// 提交事务
            System.out.println("生产者发送消息:" + msg);
        } catch (Exception e) {
            System.out.println("消息进行回滚操作");
            channel.txRollback();// 回滚事务
        } finally {
            channel.close();
            connection.close();
        }

    }
}

Consumer

/**
 * FileName: Consumer
 * Author:   wangxinqiao
 * Date:     2020/1/14 9:41 下午
 * Description: 消费者
 * History:
 */
public class Consumer {
    public static final String QUEUE_NAME = "test_queue";

    public static void main(String[] args) throws Exception {
        // 1.获取连接
        Connection connection = MQConnectionUtils.newConnection();
        // 2.创建通道
        Channel channel = connection.createChannel();
        // 3.创建队列声明
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // confirm机制
        channel.confirmSelect();
        String msg = "wangxinqiao";
        // 4.发送消息
        channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
        System.out.println("生产者发送消息:" + msg);
        if (!channel.waitForConfirms()) {
            System.out.println("消息发送失败!");
        } else {
            System.out.println("消息发送成功!");
        }
    }
}

你可能感兴趣的:(rabbitmq AMQP消息确认机制90_02)