RabbitMQ-死信队列
基于spring boot
需求(处理订单超时未支付):
- 用户下单,给生成一个订单
- 30分钟内,如果用户未支付,则取消订单
思路:
- 用户下单,生成一个订单
- 发消息给 基本队列(消息要设置TTL过期时间)
- 消息达到TTL时间,变成死信息,转到死信队列
- 处理死信队列里的数据
接着补充完整
- 用户下单,生成一个订单
- 发送一条消息(设置TLL,目标交换机和目标路由Key)
- 根据 Exchange 和 routingKey 路由到 基本队列
- 消息在基本队列里待TLL的时间,变成死信息
- 根据所在的基本队列 所绑定的 死信交换机和路由,找到死信队列
- 消息转到死信队列
- 处理消息
消息流转图
如何设置 交换机、路由、队列?
//伪代码
-----------------------------------
声明一个交换机 exchange-base
声明一个队列 queue-base ,设置他的死信息路由
Map<String, Object> argsMap= Maps.newHashMap();
argsMap.put("x-dead-letter-exchange","死信交换机 exchange-dead");
argsMap.put("x-dead-letter-routing-key","死信路由 dead-routingKey");
return new Queue("queue-base""",true,false,false,argsMap);
将 【交换机exchange-base】 和 【队列queue-base】 绑定 with 【路由 base-routingKey】
-----------------------------------
声明死信交换机 exchange-dead
声明死信队列 queue-dead
将 【死信交换机 exchange-dead】 和 【死信队列 queue-dead】 绑定 with 【路由dead-routingKey】
-----------------------------------
生产者
设置 消息发送到 基本队列 queue-base
设置消息TLS
rabbitTemplate.setExchange("【交换机exchange-base】");
rabbitTemplate.setRoutingKey("【路由 base-routingKey】");
Message message = new Message();
//......
MessageProperties mp=message.getMessageProperties(); mp.setExpiration(300000);
消费者
只需要监听 【死信队列 queue-dead】
@RabbitListener(queues = {"【死信队列 queue-dead】"},containerFactory = "消费者")
public void consumeExpireOrder(KillSuccessUserInfo info){
//..... 处理
}