首先我先介绍一下延时队列的应用场景,延迟队列存储的对象是对应的延迟消息,所谓"延迟消息"是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。
延迟队列的使用场景有很多,比如:
在订单系统中, 个用户下单之后通常有 分钟的时间进行支付,如果 30 分钟之内没有支付成功,那么这个订单将进行异常处理,这时就可以使用延迟队列来处理这些订单了
用户希望通过手机远程遥控家里的智能设备在指定的时间进行工作。这时候就可以将用户指令发送到延迟队列,当指令设定的时间到了再将指令推送到智能设备
在AMQP协议中,或者RabbitMQ本身没有直接支持延迟队列的功能,但是可以通过配置死信队列和设置消息或队列的过期时间来模拟出延迟队列的功能。
在我个人文章里面实现死信队列的代码里其实已经隐约的体现了这一点,当我们将消息设置过期时间后,靠过期时间来触发死信队列将消息扔给替补队列进行处理的这个过程就是实现延迟队列。
在真实应用中,对于延迟队列可以根据延迟时间的长短分为多个等级,一般分为 秒、 10秒、 30 秒、 1分钟、 5分钟、 10 分钟、 30 分钟、 小时这几个维度,当然也可以再细化 下。
首先介绍一下两种对消息设置过期的方法
消息过期
1.对消息设置过期
2.对队列设置消息过期
为了简化说明,这里只设置了 5秒、 10 秒、 30 秒、 1分钟这四个等级。根据应用需求的不同,生产者在发送消息的时候通过设置不同的路由键,以此将消息发送到与交换器绑定的不同的队列中。这里队列分别设置了过期时间为 5秒、 10 秒、 30 秒、 1分钟,同时也分别配置了 DLX 和相应的死信队列。当相应的消息过期时,就会转存到相应的死信队列(即延迟队列〉中,这样消费者根据业务自身的情况,分别选择不同延迟等级的延迟队列进行消费
代码如下:
/**
* @Description: 消息队列配置类
* @Author: zw
*/
@Configuration
public class RabbitConfig {
/**
* 死信队列跟交换机类型没有关系 不影响该类型交换机的特性.
*/
@Bean
DirectExchange deadL