目次
一、本文抒写配景
二、开始啦!let'go!
三、来吧!Common On,进入代码实现吧!
1. 死信队列原理
2. 实现案例
四、本文总结
一、本文抒写配景
前面我也在延长队列篇章提到过死信队列,也提到过一些应用场景!
本日呢,这篇文章,重要就是实战一个业务场景的小Demo流程,哈哈,那就是延长关闭订单。
二、开始啦!let'go!
起首我来教学下,这个场景非经常见,尤其是和付出挂钩的业务,一定会有雷同的场景。
注:
固然,本文紧张的是把握延长消息的用法,而不是实现一个真实付出的场景!(由于实现真实付出
的场景,涉及的知识太多啦,思量的环境太多了,呜呜呜,放过我吧!)
三、来吧!Common On,进入代码实现吧!
本章代码实现的团体思绪重要为以下:
- SpringBoot整合RabbitMQ,使用死信队列实现延长关闭订单的结果。
1. 死信队列原理
使用RabbitMQ的懒斲丧机制,当消息高出TTL逾期时间未被斲丧,就会通过死信互换机放入死信
队列中,再专门斲丧死信队列中的消息,到达延长处置处罚的结果。
一张图看明白
别说啦,前面本人已经提到过死信互换机啦,这张图的头脑,跟死信互换机所画图头脑有肯定的挂
钩哟,有爱好可参考下本人死信互换机篇章!
2. 实现案例
本文为了突出焦点的逻辑,案例就用伪代码来展示啦,省略一些非须要的东西,如许会显得更清楚直观。
创建订单消息对象
- // OrderMessage.java
- public class OrderMessage {
- private String orderId;
- // 省略getter和setter
- }
复制代码 创建订单服务类,也就是实行关闭订单的一些业务逻辑,比如调微信付出关闭订单利用,或改当地业务状态等。
- @Service
- public class OrderService {
- public void closeOrder(String orderId) {
- // 执行关单操作
- System.out.println("关闭订单:" + orderId);
- }
- }
复制代码 创建延长队列设置类,这里的焦点就是使用了RabbitMQ的消息逾期(ttl)特性,以及界说死信互换机 --> 转发的
路由 --> 死信队列。
- @Configuration
- public class DelayQueueConfig {
- // 定义延迟队列名称
- public static final String DELAY_QUEUE_NAME = "delay.queue";
- // 定义死信队列名称
- public static final String DEAD_LETTER_QUEUE_NAME = "dead.letter.queue";
- // 定义延迟时间(单位:毫秒)
- public static final long DELAY_TIME = 5000;
- @Bean
- public Queue delayQueue() {
- Map<String, Object> args = new HashMap<>();
- // `x-dead-letter-exchange`被设置为空字符串,表示将死信消息发送到默认交换机。
- // 如果您想要将死信消息发送到特定的交换机,可以将其设置为相应的交换机名称。
- args.put("x-dead-letter-exchange", "");
- args.put("x-dead-letter-routing-key", DEAD_LETTER_QUEUE_NAME);
- args.put("x-message-ttl", DELAY_TIME);
- return new Queue(DELAY_QUEUE_NAME, true, false, false, args);
- }
- @Bean
- public Queue deadLetterQueue() {
- return new Queue(DEAD_LETTER_QUEUE_NAME);
- }
- }
复制代码 创建消息发送者,用于向延长队列发送订单消息,发送到指定的互换机和延长队列。
- @Component
- public class OrderMessageSender {
- @Autowired
- private RabbitTemplate rabbitTemplate;
- @Value(DelayQueueConfig.DELAY_QUEUE_NAME)
- private String delayQueue;
- public void sendOrderMessage(OrderMessage orderMessage) {
- rabbitTemplate.convertAndSend("", delayQueue, orderMessage);
- }
- }
复制代码 创建消息吸取者,也就是监听前面界说的死信队列的消息,斲丧消息并处置处罚关单逻辑。
- @Component
- public class OrderMessageReceiver {
- @Autowired
- private OrderService orderService;
- @RabbitListener(queues = DelayQueueConfig.DEAD_LETTER_QUEUE_NAME)
- public void processDeadLetterMessage(OrderMessage orderMessage) {
- // 处理关单逻辑
- orderService.closeOrder(orderMessage.getOrderId());
- }
- }
复制代码 四、本文总结
末了,咱们再来回首总结一下使用死信队列实现延长关单的流程:
1、订单消息通过OrderMessageSender发送到延长队列。
2、延长时间事后,订单消息被投递到死信队列。
3、OrderMessageReceiver监听死信队列,一旦有消息到达,调用OrderService的closeOrder方法
实行关单利用。
这种延长关单功能还可以用于定时使命、订单超时处置处罚等场景。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |