RabbitMQ(死信队列)

一、本文抒写背景

前面我也在延迟队列篇章提到过死信队列,也提到过一些应用场景!

今天呢,这篇文章,主要就是实战一个业务场景的小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方法执行关单

操作。

这种延迟关单功能还可以用于定时任务、订单超时处理等场景。

相关推荐
num_killer2 小时前
小白的Langchain学习
java·python·学习·langchain
期待のcode2 小时前
Java虚拟机的运行模式
java·开发语言·jvm
程序员老徐2 小时前
Tomcat源码分析三(Tomcat请求源码分析)
java·tomcat
a程序小傲3 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
仙俊红3 小时前
spring的IoC(控制反转)面试题
java·后端·spring
阿湯哥3 小时前
AgentScope Java 集成 Spring AI Alibaba Workflow 完整指南
java·人工智能·spring
小楼v3 小时前
说说常见的限流算法及如何使用Redisson实现多机限流
java·后端·redisson·限流算法
与遨游于天地3 小时前
NIO的三个组件解决三个问题
java·后端·nio
czlczl200209253 小时前
Guava Cache 原理与实战
java·后端·spring
yangminlei3 小时前
Spring 事务探秘:核心机制与应用场景解析
java·spring boot