不做任何处理会出现的问题
如果不做任何处理,当消费消息时出现异常,默认会不断的重试,这显然不是我们希望的
我们希望的是:可以指定重试的次数,重试完了之后进入死信队列,然后就可以人为的对死信队列进行处理
代码实现
设置重试次数
关联死信队列
需要将一个Queue关联死信队列的Exchange和RoutingKey
package com.wcong.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author wcong
* @version 1.0
* @date 2020-07-30 21:01
*/
@Configuration
public class EmailDlConfig {
/**
* 正常的消息消息交换机
* @return
*/
@Bean
public DirectExchange emailExchange(){
return new DirectExchange("EmailExchange");
}
/**
* 用来做死信队列的交换机
* @return
*/
@Bean
public DirectExchange emailDlExchange(){
return new DirectExchange("emailDlExchange");
}
/**
* 正常的Queue,关联死信队列的Exchange和RoutingKey
* @return
*/
@Bean
public Queue emailQueue(){
return QueueBuilder.durable("emailQueue")
// 关联死信队列的交换机和RoutingKey
.withArgument("x-dead-letter-exchange","emailDlExchange")
.withArgument("x-dead-letter-routing-key","emailDlRouting")
.build();
}
/**
* 用来做死信队列的Queue
* @return
*/
@Bean
public Queue emailDlQueue(){
// 默认也是持久化的
return new Queue("emailDlQueue",true);
}
/**
* 正常路由
* @return
*/
@Bean
public Binding emailBinding(){
return BindingBuilder.bind(emailQueue()).to(emailExchange()).with("emailRouting");
}
/**
* 私信队列的路由
* @return
*/
@Bean
public Binding emailDlBinding(){
return BindingBuilder.bind(emailDlQueue()).to(emailDlExchange()).with("emailDlRouting");
}
}
测试
模拟异常
可看到多次重试后的消息进入了死信队列
处理死信队列
1、通过人工去处理死信队列
2、等待系统正常后把死信队列中的消息路由到Queue去处理