一、前言
-
延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。
-
需求:
-
下单后,30分钟未支付,取消订单,回滚库存。
-
新用户注册成功7天后,发送短信问候。
-
-
遗憾的是,在RabbitMQ中并未提供延迟队列功能,不过可以使用:TTL+死信队列 组合实现延迟队列的效果。
二、生产者代码
-
创建RabbitMQ队列配置类com.example.rabbitmq_producer.config;
@Configuration public class RabbitMQConfig { //交换机名称 public static final String ITEM_EXCHANGE = "item_exchange"; public static final String DEAD_EXCHANGE = "dead_exchange"; //队列名称 public static final String ITEM_QUEUE = "item_queue"; public static final String DEAD_QUEUE = "dead_queue"; //声明业务交换机 @Bean("itemExchange") public Exchange itemExchange(){ return ExchangeBuilder.directExchange(ITEM_EXCHANGE).durable(true).build(); } //声明死信交换机 @Bean("deadExchange") public Exchange deadExchange(){ return ExchangeBuilder.directExchange(DEAD_EXCHANGE).durable(true).build(); } //声明业务队列 @Bean("itemQueue") public Queue itemQueue(){ return QueueBuilder .durable(ITEM_QUEUE) .ttl(20000) // 设置队列过期时间为20秒钟 .deadLetterExchange(DEAD_EXCHANGE) // 这里声明当前队列绑定的死信交换机 .deadLetterRoutingKey("infoDead") // 这里声明当前队列的死信路由key .build(); } //声明死信队列 @Bean("deadQueue") public Queue deadQueue(){ return QueueBuilder .durable(DEAD_QUEUE) .build(); } //绑定队列和交换机(业务) @Bean public Binding itemQueueExchange(@Qualifier("itemQueue") Queue queue, @Qualifier("itemExchange") Exchange exchange){ return BindingBuilder.bind(queue).to(exchange).with("infoRouting").noargs(); } //绑定队列和交换机(死信) @Bean public Binding deadQueueExchange(@Qualifier("deadQueue") Queue queue, @Qualifier("deadExchange") Exchange exchange){ return BindingBuilder.bind(queue).to(exchange).with("infoDead").noargs(); } }
-
编写测试类;
@SpringBootTest public class RabbitMQTest { @Autowired private RabbitTemplate rabbitTemplate; @Test public void test(){ //发送消息 rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_EXCHANGE,"infoRouting","订单:100021442"); System.out.println("订单提交成功,请及时付款"); } }
三、消费者代码
-
编写消息监听器com.example.rabbitmq_consumer.listener;
@Component public class MyListener { @RabbitListener(queues = "dead_queue") public void printMsg(String msg) throws IOException { System.out.println("时间到了,验证订单:" + msg); } }
四、总结
- 延迟队列 指消息进入队列后,可以被延迟一定时间,再进行消费。
- RabbitMQ没有提供延迟队列功能,但是可以使用 : TTL + DLX 来实现延迟队列效果。