D6_根本结构(D4_队列(D3_死信队列))

[复制链接]
发表于 2026-1-14 08:50:22 | 显示全部楼层 |阅读模式
目次

一、本文抒写配景
二、开始啦!let'go!
三、来吧!Common On,进入代码实现吧!
1. 死信队列原理
2. 实现案例
四、本文总结


一、本文抒写配景

前面我也在延长队列篇章提到过死信队列,也提到过一些应用场景!
本日呢,这篇文章,重要就是实战一个业务场景的小Demo流程,哈哈,那就是延长关闭订单。
二、开始啦!let'go!

起首我来教学下,这个场景非经常见,尤其是和付出挂钩的业务,一定会有雷同的场景。
注:
固然,本文紧张的是把握延长消息的用法,而不是实现一个真实付出的场景!(由于实现真实付出
的场景,涉及的知识太多啦,思量的环境太多了,呜呜呜,放过我吧!)
三、来吧!Common On,进入代码实现吧!

本章代码实现的团体思绪重要为以下:


  • SpringBoot整合RabbitMQ,使用死信队列实现延长关闭订单的结果。
1. 死信队列原理

使用RabbitMQ的懒斲丧机制,当消息高出TTL逾期时间未被斲丧,就会通过死信互换机放入死信
队列中,再专门斲丧死信队列中的消息,到达延长处置处罚的结果。
一张图看明白


别说啦,前面本人已经提到过死信互换机啦,这张图的头脑,跟死信互换机所画图头脑有肯定的挂
钩哟,有爱好可参考下本人死信互换机篇章!
2. 实现案例

本文为了突出焦点的逻辑,案例就用伪代码来展示啦,省略一些非须要的东西,如许会显得更清楚直观。
创建订单消息对象
  1. // OrderMessage.java
  2. public class OrderMessage {
  3.     private String orderId;
  4.     // 省略getter和setter
  5. }
复制代码
创建订单服务类,也就是实行关闭订单的一些业务逻辑,比如调微信付出关闭订单利用,或改当地业务状态等。
  1. @Service
  2. public class OrderService {
  3.     public void closeOrder(String orderId) {
  4.         // 执行关单操作
  5.         System.out.println("关闭订单:" + orderId);
  6.     }
  7. }
复制代码
创建延长队列设置类,这里的焦点就是使用了RabbitMQ的消息逾期(ttl)特性,以及界说死信互换机 --> 转发的
路由 --> 死信队列。
  1. @Configuration
  2. public class DelayQueueConfig {
  3.     // 定义延迟队列名称
  4.     public static final String DELAY_QUEUE_NAME = "delay.queue";
  5.     // 定义死信队列名称
  6.     public static final String DEAD_LETTER_QUEUE_NAME = "dead.letter.queue";
  7.     // 定义延迟时间(单位:毫秒)
  8.     public static final long DELAY_TIME = 5000;
  9.     @Bean
  10.     public Queue delayQueue() {
  11.         Map<String, Object> args = new HashMap<>();
  12.         // `x-dead-letter-exchange`被设置为空字符串,表示将死信消息发送到默认交换机
  13.         // 如果您想要将死信消息发送到特定的交换机,可以将其设置为相应的交换机名称。
  14.         args.put("x-dead-letter-exchange", "");
  15.         args.put("x-dead-letter-routing-key", DEAD_LETTER_QUEUE_NAME);
  16.         args.put("x-message-ttl", DELAY_TIME);
  17.         return new Queue(DELAY_QUEUE_NAME, true, false, false, args);
  18.     }
  19.     @Bean
  20.     public Queue deadLetterQueue() {
  21.         return new Queue(DEAD_LETTER_QUEUE_NAME);
  22.     }
  23. }
复制代码
创建消息发送者,用于向延长队列发送订单消息,发送到指定的互换机和延长队列。
  1. @Component
  2. public class OrderMessageSender {
  3.     @Autowired
  4.     private RabbitTemplate rabbitTemplate;
  5.     @Value(DelayQueueConfig.DELAY_QUEUE_NAME)
  6.     private String delayQueue;
  7.     public void sendOrderMessage(OrderMessage orderMessage) {
  8.         rabbitTemplate.convertAndSend("", delayQueue, orderMessage);
  9.     }
  10. }
复制代码
创建消息吸取者,也就是监听前面界说的死信队列的消息,斲丧消息并处置处罚关单逻辑。
  1. @Component
  2. public class OrderMessageReceiver {
  3.     @Autowired
  4.     private OrderService orderService;
  5.     @RabbitListener(queues = DelayQueueConfig.DEAD_LETTER_QUEUE_NAME)
  6.     public void processDeadLetterMessage(OrderMessage orderMessage) {
  7.         // 处理关单逻辑
  8.         orderService.closeOrder(orderMessage.getOrderId());
  9.     }
  10. }
复制代码
四、本文总结

末了,咱们再来回首总结一下使用死信队列实现延长关单的流程:
1、订单消息通过OrderMessageSender发送到延长队列。
2、延长时间事后,订单消息被投递到死信队列。
3、OrderMessageReceiver监听死信队列,一旦有消息到达,调用OrderService的closeOrder方法
实行关单利用。
这种延长关单功能还可以用于定时使命、订单超时处置处罚等场景。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表