生产者确认机制:
默认情况下发送消息的操作是不会返回任何信息给生产者的,也就是默认情况下生产者是不知道消息有没有正确的到达服务器, 如果在消息到达服务器之前就已经丢失了,持久化操作也解决不了问题。
RabbitMQ针对这个问题,提供了两种解决方式:
-
通过事务机制实现
-
通过发送方确认(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();
}
}