Spring Boot系列教程之死信队列详解系列教程之死信队列详解
主要给大家介绍了关于Spring Boot系列教程之死信队列的相关资料,文中通过示例代码介绍的非常详细,对大
家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
前言前言
在说死信队列之前,我们先介绍下为什么需要用死信队列。
如果想直接了解死信对接,直接跳入下文的"死信队列"部分即可。
ack机制和机制和requeue-rejected属性属性
我们还是基于上篇《Spring Boot系列——7步集成RabbitMQ》的demo代码来说。
在项目springboot-demo我们看到application.yaml文件部分配置内容如下
...
listener:
type: simple
simple:
acknowledge-mode: auto
concurrency: 5
default-requeue-rejected: true
max-concurrency: 100
...
其中
acknowledge-mode
该配置项是用来表示消息确认方式,其有三种配置方式,分别是none、manual和auto。
none意味着没有任何的应答会被发送。
manual意味着监听者必须通过调用Channel.basicAck()来告知所有的消息。
auto意味着容器会自动应答,除非MessageListener抛出异常,这是默认配置方式。
default-requeue-rejected
该配置项是决定由于监听器抛出异常而拒绝的消息是否被重新放回队列。默认值为true。
我一开始对于这个属性有个误解,我以为rejected是表示拒绝,所以将requeue-rejected连起来是拒绝重新放回队列,后来查
了资料明白这个属性的功能才想起来rejected是个形容词,其表示的应该是被拒绝的消息
所以如果该属性配置为true表示会重新放回队列,如果配置为false表示不会放回队列。
下面我们看看acknowledge-mode参数和default-requeue-rejected参数使用不同的组合方式,RabbitMQ是如何处理消息的。
代码依然使用springboot-demo中的RabbitApplicationTests发送消息,使用Receiver类监听demo-queue队列的消息。
对于Receiver类添加了一行代码,该代码模拟抛出异常
@Component
public class Receiver {
@RabbitListener(queues = "demo_queue")
public void created(String message) {
System.out.println("orignal message: " + message);
int i = 1/0;
}
}
acknowledge-mode=none, default-requeue-rejected=false