RabbitMQ事务之Confirm模式简介
* 生产者将信通设置成 confirm模式,一旦信通进入confirm模式
* 所有在该信通上面发布的消息都会被指派一个唯一的ID,
* 一旦消息被投递到所有匹配的队列之后,
* broker就会发送一个确认给生产者,这就使得生产者知道消息已经
* 正确到达目的队列了,如果消息和队列是可持久化的,那么确认消息会将消息写入
* 次哦按之后发出,broker回传给生产者的确认消息中deliver-tag域包含了确认消息的序列号
* 此外broker也可以设置basic.ack的multiple域,表示到这个序列号之前的所有消息都已经得到了处理
代码参考
生产者
/**
* Confirm
*
* @author zhang
*
* 生产者将信通设置成 confirm模式,一旦信通进入confirm模式 所有在该信通上面发布的消息都会被指派一个唯一的ID,
* 一旦消息被投递到所有匹配的队列之后, broker就会发送一个确认给生产者,这就使得生产者知道消息已经
* 正确到达目的队列了,如果消息和队列是可持久化的,那么确认消息会将消息写入
* 次哦按之后发出,broker回传给生产者的确认消息中deliver-tag域包含了确认消息的序列号
* 此外broker也可以设置basic.ack的multiple域,表示到这个序列号之前的所有消息都已经得到了处理
*
*
* 编程模式: 1.普通 发一条 waitForConfirms 2.批量的 发一批 waitForCOnfirms
*
*
*
*
* 3.异步 confirm模式:提供一个回调
*/
public class ConfirmSend {
public static final String QUEUE_NAME = "p_confirmsend";
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
// 获取连接
Connection connection = ConnectHelp.getConnect();
// 创建通道
Channel channel = connection.createChannel();
// 创建队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 开启事务
channel.confirmSelect();
// 数据
String msg = "this is data";
// 发送数据
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
// 监听发送成功与失败
if (channel.waitForConfirms()) {
System.out.println("send is ok");
} else {
System.out.println("send is fail");
}
// 关闭
channel.close();
connection.close();
}
}
消费者
/**
* RabbitMQ 之comfirm 消费者
*
* @author zhang
*
*/
public class ConfirmRevc {
public static final String QUEUE_NAME = "p_confirmsend";
public static void main(String[] args) throws IOException, TimeoutException {
// 获取连接
Connection connetion = ConnectHelp.getConnect();
// 创建通道
Channel channel = connetion.createChannel();
// 声明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 接受数据,并监听
channel.basicConsume(QUEUE_NAME, new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
System.out.println("confirm Revc:" + new String(body, "utf-8"));
}
});
}
}