Confirm确认消息
-
消息的确认, 是指生产者投递消息后, 如果Broker收到消息, 则会给我们产生一个应答
-
生产者进行接收应答, 用来确定这条消息是否正常发送到Broker, 这种方式也是消息的可靠性投递的核心保障
如何实现Confirm确认消息
- 在channel上开启确认模式 : channel.confirmSelect()
- 在channel上添加监听 : addConfirmListener, 监听成功和失败的返回结果, 根据具体的结果对消息进行重新发送, 或记录日志等后续处理
Producer代码
package com.qiyexue.confirm;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConfirmListener;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* Confirm确认消息模式生产者
*
* @author 七夜雪
* @create 2018-12-15 16:12
*/
public class ProducerByConfirm {
public static void main(String[] args) throws Exception {
// 1. 创建ConnectionFactory, 并设置属性
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.72.138");
factory.setPort(5672);
factory.setVirtualHost("/");
// 2. 创建连接
Connection connection = factory.newConnection();
// 3. 创建channel
Channel channel = connection.createChannel();
// 4. 开启Confirm模式
channel.confirmSelect();
String exchangeName = "test_confirm_exchange";
String routingKey = "confirm.qiye";
// 5. 发送消息
String msg = "Send Msg By Confirm ...";
channel.basicPublish(exchangeName, routingKey, null, msg.getBytes());
// 6. 设置监听
channel.addConfirmListener(new ConfirmListener() {
public void handleAck(long deliveryTag, boolean multiple) throws IOException {
System.out.println("-------ACK Success--------");
}
public void handleNack(long deliveryTag, boolean multiple) throws IOException {
System.err.println("-------ACK Failed--------");
}
});
// 因为设置了监听, 这里就不关闭channel和connection了
}
}
Consumer代码
package com.qiyexue.confirm;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
/**
* Confirm消息确认的生产者
*
* @author 七夜雪
* @create 2018-12-15 16:19
*/
public class ConsumerByConfirm {
public static void main(String[] args) throws Exception {
// 1. 创建连接工厂并设置属性
ConnectionFactory factory = new ConnectionFactory();;
factory.setHost("192.168.72.138");
factory.setPort(5672);
factory.setVirtualHost("/");
// 2. 创建连接
Connection connection = factory.newConnection();
// 3. 创建channel
Channel channel = connection.createChannel();
// 4. 声明Exchange
String exchangeName = "test_confirm_exchange";
String exchangeType = "topic";
String routingKey = "confirm.*";
channel.exchangeDeclare(exchangeName, exchangeType, true, false, null);
// 5. 声明消息队列
String queueName = "test_confirm_queue";
channel.queueDeclare(queueName, true, false, false, null);
// 6. 绑定队列和Exchange
channel.queueBind(queueName, exchangeName, routingKey);
// 7. 创建一个消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 8. 设置消费者从哪个队列开始消费, 设置自动ACK
channel.basicConsume(queueName, true, consumer);
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String msg = new String(delivery.getBody());
System.out.println(msg);
}
}
}
相关链接
RabbitMQ入门与AMQP协议简介
RabbitMQ成员简介
RabbitMQ高级特性-消息可靠性投递
RabbitMQ高级特性-幂等性保障
RabbitMQ高级特性-Confirm确认消息
RabbitMQ高级特性-Return消息机制
RabbitMQ高级特性-消费端自定义监听
RabbitMQ高级特性-消费端限流
RabbitMQ高级特性-消费端ACK与重回队列
RabbitMQ高级特性-TTL队列/消息
RabbitMQ高级特性-死信队列(DLX)
Spring AMQP整合RabbitMQ
SpringBoot整合RabbitMQ
RabbitMQ集群架构模式介绍
从零开始搭建高可用RabbitMQ镜像模式集群
RabbitMQ集群恢复与故障转移
RabbitMQ-基础组件封装
Git代码地址
慕课网<RabbitMQ消息中间件技术精讲>学习笔记