Rabbitmq实现延时队列一般而言有两种形式:
方式一:利用两个特性: Time To Live(TTL)、Dead Letter Exchanges(DLX)
方式二:利用rabbitmq中的插件x-delay-message
方式一:
此方式使用的是direct模式的Exchange交换机。
原理图:
原理图解释:
1、声明延迟队列(普通队列声明方式),在声明时设置x-dead-letter-exchange和x-dead-letter-routing-key两个属性(具体含义参见下面代码中的解释);
2、绑定延迟队列到交换机DEAD_LETTER_EXCHANGE(普通交换机绑定方式,不要被死信交换机这个名字忽悠了),注意,要指定路由键DELAY_ROUTING_KEY;
3、在消息生产者中向指定交换机DEAD_LETTER_EXCHANGE和指定路由键DELAY_ROUTING_KEY发送消息,消息会被发送到延迟队列DELAY_QUEUE上;
4、注意,延迟队列DELAY_QUEUE,是没有消费者接收的,即在消费者中不要监听此延迟队列。如果延迟队列DELAY_QUEUE有消费者的话,那么此队列中的消息就会被立即消费,而不会因为设置的过期时间到期后过期,也就不会成为死信(Dead Letter),那更不会再向绑定的死信交换机发送信息--也就不会路由到新的队列。
5、在延迟队列中的消息到了过期时间之后,因为设置了x-dead-letter-exchange和x-dead-letter-routing-key两个属性,队列中的消息会变成死信消息,之后会根据绑定的死信交换机和路由键将此死信消息重新发送到指定的交换机IMMEDIATE_EXCHANGE到达指定队列IMMEDIATE_QUEUE,消费者中实际监听的是最后这个IMMEDIATE_QUEUE队列,至此,实现了延迟队列的功能。
方式一常量配置:
package com.shengquan.config; |
方式一配置类:
队列声明、交换机声明、队列与交换机的绑定配置类:
package com.shengquan.config; |