参考:<<RabbitMQ实战指南>>
延迟队列存储的对象是对应的延迟消息,所谓“延迟消息”是指当消息被发送以后,并不让消费者立即拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。
在AMQP协议中,或者RabbitMQ本身没有直接支持延迟队列的功能,但是可以通过TTL和DLX(死信交换器)模拟延迟队列的功能。
在 RabbitMQ - 死信队列 这篇博客中说明了死信队列的概念及用法,实际上,延时队列也就是通过设置消息过期时间,但是对应的队列上不设置消费者,而是等待消息过期后转发到死信队列上再进行消费。
借用书中的一张图来进行说明:
- 生产者在发送消息时设置不同的路由键,以此将消息发送到与交换器绑定的不同的队列中。
- 下图的队列分别设置了过期时间为5s、10s、30s、1min,同时也分别配置了DLX和相应的死信队列
- 当相应的消息过期时,就会转存到相应的死信队列(即延迟队列)中,消费者选择不同的延迟队列进行消费即可
测试代码和死信队列所用代码一样,可以参考博客:RabbitMQ - 死信队列
springboot-rabbitmq-demo测试代码:https://github.com/mytt-10566/springboot-rabbitmq-demo