当前位置: 代码迷 >> 综合 >> RabbitMQ事务机制
  详细解决方案

RabbitMQ事务机制

热度:73   发布时间:2023-10-08 18:12:19.0

生产者确认机制:

      默认情况下发送消息的操作是不会返回任何信息给生产者的,也就是默认情况下生产者是不知道消息有没有正确的到达服务器, 如果在消息到达服务器之前就已经丢失了,持久化操作也解决不了问题。

RabbitMQ针对这个问题,提供了两种解决方式:

 

  1.  通过事务机制实现

  2.  通过发送方确认(publisher confirm)机制实现

事务机制:

   RabbitMQ客户端与事务机制相关的方法有三个:

  •  channel.txSelect(): 将当前的信道设置为事务模式
  •  channel.txCommit(): 用于提交事务
  •  channel.txRollback(): 用于事务回滚

如果在事务提交之前发生异常,我们可以将其捕获,通过执行channel.txRollback()实现事务回滚 

package com.song.songvue.config.message;import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** 生产者客户端代码*/
public class RabbitProducer {private static final String IP_ADDRESS = "172.16.200.239";private static final int PORT = 5672;public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory factory = new ConnectionFactory();factory.setHost(IP_ADDRESS);factory.setPort(PORT);factory.setUsername("root");factory.setPassword("123456");// 创建连接Connection connection = factory.newConnection();// 创建信道Channel channel = connection.createChannel();try {channel.txSelect();channel.basicPublish("song_multi", "black", MessageProperties.PERSISTENT_TEXT_PLAIN,"transaction message".getBytes());int result = 1 / 0;channel.txCommit();} catch (Exception e) {channel.txRollback();}// 关闭资源channel.close();connection.close();}
}