
2022-03-12
251
原创
RabbitMQ实现延时队列
上次面试阿里,问了我项目难点,我说不出,寄了,然后我就再项目中加了支付功能,支付有一个15分钟未支付取消订单的功能,我用了rabbitMQ的延时队列去实现
总体的设计
一个交换器,两个队列(一个死信队列,一个普通对列),首先客户端请求一个订单,把订单交给交换机,交换机根据routing-key把消息交给死信队列
设置死信队列中的消息的过期时间,我这里设置为15分钟
15分钟过期后交给交换机,交换机根据routing-key把消息交给普通队列让他去做处理
代码创建交换机和队列
@Configuration
public class MyMQConfig {
//死信队列
@Bean
public Queue orderDelayQueue(){
//设置死信队列属性
/**
* x-dead-letter-exchange:order-event-exchange
* x-dead-letter-routing-key:order.release.order
* x-message-ttl:60000
*/
Map<String,Object> arguments = new HashMap<>();
arguments.put("x-dead-letter-exchange","order-event-exchange");
arguments.put("x-dead-letter-routing-key","order-release-order");
arguments.put("x-message-ttl",900000);
Queue queue = new Queue("order.delay.queue", true, false, false,arguments);
return queue;
}
//普通的队列,用来处理死信队列中的出来的消息
@Bean
public Queue orderReleaseOrderQueue(){
Queue queue = new Queue("order.release.order.queue",true,false,false);
return queue;
}
//交换器
@Bean
public Exchange orderEventExchange(){
TopicExchange topicExchange = new TopicExchange("order-event-exchange", true, false);
return topicExchange;
}
@Bean
public Binding OrderCreateOrderBinding(){
return new Binding("order.delay.queue",
Binding.DestinationType.QUEUE,
"order-event-exchange",
"order.create.order",null);
}
@Bean
public Binding orderReleaseOrderBiding(){
return new Binding("order.release.order.queue",
Binding.DestinationType.QUEUE,
"order-event-exchange",
"order-release-order",null);
}
}
监听普通队列
@RabbitListener(queues = "order.release.order.queue")
public void listener(Order order){
Integer status = order.getStatus();
if (status != 1){
baseMapper.deleteById(order.getId());
}
}
如果订单还未支付,就从数据库中把订单删除掉
Java