微服务框架
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
服务异步通讯
文章目录
- 微服务框架
- 服务异步通讯
- 50 消息可靠性
- 50.3 消费者消息确认
- 50.3.1 消费者确认
50 消息可靠性
50.3 消费者消息确认
50.3.1 消费者确认
RabbitMQ支持消费者确认机制,即:消费者处理消息后可以向MQ发送ack回执,MQ收到ack回执后才会删除该消息。
而SpringAMQP则允许配置三种确认模式:
- manual:手动ack,需要在业务代码结束后,调用api发送ack。
- auto:自动ack,由spring监测listener代码是否出现异常,没有异常则返回ack;抛出异常则返回nack
- none:关闭ack,MQ假定消费者获取消息后会成功处理,因此消息投递后立即被删除
配置方式是修改application.yml文件,添加下面配置:
修改消费者 服务的配置文件
acknowledge-mode: none
先来个none 看看效果
修改一下监听
package cn.itcast.mq.listener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class SpringRabbitListener {
@RabbitListener(queues = "simple.queue")
public void listenSimpleQueue(String msg) {
System.out.println("消费者接收到simple.queue的消息:【" + msg + "】");
System.out.println(1 / 0);
log.info("消费者处理消息成功!");
}
}
看看控制台
OK,队列里面还有一条消息没消费
打个断点
debug 启动
OK,消息拿到了
消息已经不在了【这就是none ,投递完成马上删除】
但是后面抛异常了 ,还没处理呢,这条消息就相当于 废了
现在换成 auto 模式
来一条新的消息
OK
同样的debug 运行
看看控制台,
这个消息的状态变成 了unacked ,意思它还没有收到 ACK
现在我们放行
效果很明显, 一直在重试,又来又来,放不过去
把断点去掉
永不停止的日志,停掉服务之后
消息恢复了原来的样子【没有丢失】
但是处理方式好像不太友好,一直重试,消费者:要我死?
可以修改吗?【当然】