微服务 教程
1085个小节阅读:195.8k
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
在RabbitMQ中,消费者接收到消息后会向队列发送确认签收的消息,只有确认签收的消息才会被移除队列。这种机制称为消费者消息确认(Consumer Acknowledge,简称Ack)。类似快递员派送快递也需要我们签收,否则一直存在于快递公司的系统中。
消息分为自动确认和手动确认。自动确认指消息只要被消费者接收到,无论是否成功处理消息,则自动签收,并将消息从队列中移除。但是在实际开发中,收到消息后可能业务处理出现异常,那么消息就会丢失。此时需要设置手动签收,即在业务处理成功再通知签收消息,如果出现异常,则拒签消息,让消息依然保留在队列当中。
消费者配置开启手动签收
xxxxxxxxxx
spring
rabbitmq
host192.168.0.162
port5672
username itbaizhan
password itbaizhan
virtual-host /
# 开启手动签收
listener
simple
acknowledge-mode manual
消费者处理消息时定义手动签收和拒绝签收的情况
xxxxxxxxxx
public class AckConsumer {
queues = "my_queue") (
public void listenMessage(Message message, Channel channel) throws IOException, InterruptedException {
// 消息投递序号,消息每次投递该值都会+1
long deliveryTag = message.getMessageProperties().getDeliveryTag();
try {
int i = 1/0; //模拟处理消息出现bug
System.out.println("成功接受到消息:"+message);
// 签收消息
/**
* 参数1:消息投递序号
* 参数2:是否一次可以签收多条消息
*/
channel.basicAck(deliveryTag,true);
}catch (Exception e){
System.out.println("消息消费失败!");
Thread.sleep(2000);
// 拒签消息
/**
* 参数1:消息投递序号
* 参数2:是否一次可以拒签多条消息
* 参数3:拒签后消息是否重回队列
*/
channel.basicNack(deliveryTag,true,true);
}
}
}
实时效果反馈
1. 在RabbitMQ中,Ack可以监听
A 生产者是否成功传递到交换机
B 交换机是否成功传递到队列
C 消费者是否成功消费消息
D 以上都可以监听
2. 在RabbitMQ中,使用Ack手动签收一般在代码中的表现形式为
A 在try
中签收消息
B 在catch
中拒签消息
C 在try
中签收消息,在catch
中拒签消息
D 在try
中拒签消息,在catch
中签收消息
答案
1=>C 2=>C