RabbitMq延时队列的实现
RabbitMq延时队列的实现
消息的TTL和死信Exchange
消息的TTL
死信Exchange
延时队列的两个实现
在spring boot中创建延时队列
设计建议规范
延时队列模型
一个交换机
,一条延时队列
,一条普通队列
,
创建延时队列
@Bean
public Queue orderDelayQueue() {
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", 60000);
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() {
return new TopicExchange("order-event-exchange", true, false);
}
创建binding
@Bean
public Binding orderCreateOrderBinding(){
return new Binding("order.delay.queue",Binding.DestinationType.QUEUE,"order-event-exchange","order.create.order",null);
}
@Bean
public Binding orderReleaseOrderBinding(){
return new Binding("order.release.order.queue",Binding.DestinationType.QUEUE,"order-event-exchange","order.release.order",null);
}
测试-发送消息
@Autowired
RabbitTemplate rabbitTemplate;
@GetMapping("/test")
public String creatOrderTest(){
//订单下单成功
OrderEntity entity=new OrderEntity();
entity.setOrderSn(UUID.randomUUID().toString());
//给MQ发送消息
rabbitTemplate.convertAndSend("order-event-exchange","order.create.order",entity);
return "ok";
}
测试-接收消息
这里 @RabbitListener
注解设置了手动确认属性,ackMode="MANUAL"
也可以替换为在配置文件properties中设置spring.rabbitmq.listener.simple.acknowledge-mode=manual
。
RabbitMq默认是自动确认模式
。
@RabbitListener(queues="order.release.order.queue",ackMode="MANUAL")
public void listener(OrderEntity entity, Channel channel, Message message) throws IOException {
System.out.println("收到过期的订单消息:准备关闭订单");
//手动确认
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}