RabbitMQ 进阶使用:延迟队列实现订单超时取消

开发
本文将详细介绍如何使用RabbitMQ的延迟队列来实现订单超时取消,并提供示例代码。

在现代电商系统中,订单超时取消是一个常见的需求。例如,当用户下单后未在规定时间内完成支付,订单应自动取消。RabbitMQ的延迟队列功能可以很好地实现这一需求。本文将详细介绍如何使用RabbitMQ的延迟队列来实现订单超时取消,并提供示例代码。

延迟队列的基本概念

延迟队列是一种消息队列,其中的消息不会立即被消费,而是会延迟一段时间后才被投递到消费者。在RabbitMQ中,延迟队列可以通过插件rabbitmq-delayed-message-exchange来实现,或者通过消息的存活时间(TTL)和死信队列(DLX)的组合来实现。

延迟队列的实现方案

方案一:使用rabbitmq-delayed-message-exchange插件

  • 安装插件: 下载rabbitmq-delayed-message-exchange插件,并将其放置在RabbitMQ的插件目录中,然后重启RabbitMQ服务。
  • 声明延迟交换机: 使用x-delayed-message类型的交换机,并设置消息的延迟时间。
  • 发送延迟消息: 将订单消息发送到延迟交换机,并指定延迟时间。
  • 消费者监听队列: 消费者监听与延迟交换机绑定的队列,当消息延迟时间到达后,消息会被投递到队列中,消费者进行处理。

方案二:使用TTL和DLX

  • 声明带有TTL的队列: 创建一个队列,并设置消息的存活时间(TTL)。
  • 绑定死信交换机: 将队列绑定到死信交换机,并设置死信路由键。
  • 发送消息: 将订单消息发送到队列,并设置消息的过期时间(TTL)。
  • 消费者监听死信队列: 消费者监听与死信交换机绑定的队列,当消息过期后,消息会被投递到死信队列中,消费者进行处理。

示例代码

以下是使用rabbitmq-delayed-message-exchange插件实现订单超时取消的示例代码。

生产者代码:

import com.rabbitmq.client.*;

public class OrderProducer {

    private static final String EXCHANGE_NAME = "delayed_orders";
    private static final String ROUTING_KEY = "order.delay";

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            // 声明延迟交换机
            channel.exchangeDeclare(EXCHANGE_NAME, "x-delayed-message", true, false, null);

            // 准备消息属性,设置延迟时间戳(单位为毫秒)
            AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
                    .headers(new HashMap<String, Object>() {{
                        put("x-delay", 30 * 60 * 1000L); // 延迟30分钟
                    }})
                    .build();

            // 发布带有延迟的消息
            String message = "Order timeout for orderId XYZ";
            channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, properties, message.getBytes());

            System.out.println("Sent order cancellation message with delay of 30 minutes.");
        }
    }
}

消费者代码

import com.rabbitmq.client.*;

public class OrderConsumer {

    private static final String QUEUE_NAME = "order_timeout_queue";
    private static final String EXCHANGE_NAME = "delayed_orders";
    private static final String ROUTING_KEY = "order.delay";

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            // 声明队列并绑定到延迟交换机
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);
            channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);

            // 定义消费者并启动消费循环
            DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                String message = new String(delivery.getBody(), "UTF-8");
                System.out.println("Received delayed message: " + message);

                // 在此处添加处理订单超时取消的逻辑
                handleOrderCancellation(message);
            };

            CancelCallback cancelCallback = consumerTag -> System.out.println("Consumer cancelled");

            channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
        }
    }

    private static void handleOrderCancellation(String message) {
        // 根据接收到的消息内容(例如订单ID),调用相应的服务接口或方法进行订单取消操作
        System.out.println("Order cancelled: " + message);
    }
}

配置说明

  • 安装并启用延迟队列插件:确保rabbitmq-delayed-message-exchange插件已安装并启用。
  • RabbitMQ连接配置:在代码中,通过ConnectionFactory配置RabbitMQ服务器的地址、端口等信息。
  • 交换机和队列的声明:在生产者代码中,声明一个x-delayed-message类型的延迟交换机,并设置消息的延迟时间。在消费者代码中,声明一个队列并将其绑定到延迟交换机。
  • 消息发布和消费:生产者将带有延迟时间的订单消息发布到延迟交换机,消费者监听队列并在消息延迟时间到达后进行处理。

结论

通过使用RabbitMQ的延迟队列功能,可以方便地实现订单超时取消等需要延迟处理的场景。本文介绍了两种实现方案,并提供了使用rabbitmq-delayed-message-exchange插件的示例代码。希望本文对你有所帮助。

责任编辑:赵宁宁 来源: 后端Q
相关推荐

2024-10-16 09:29:30

RabbitMQ延迟队列

2023-09-05 15:48:14

RabbitMQ延迟队列

2024-04-19 00:47:07

RabbitMQ消息机制

2023-10-10 13:39:53

Spring队列优化

2024-04-28 08:52:33

RabbitMQ延迟队列延迟插件

2024-01-26 13:16:00

RabbitMQ延迟队列docker

2023-10-23 10:02:58

RabbitMQ延迟队列

2024-02-26 08:50:37

订单自动取消消息

2021-12-08 10:47:35

RabbitMQ 实现延迟

2021-10-15 10:39:43

RabbitMQ队列延迟

2023-08-08 08:28:03

消息消费端Spring

2024-03-18 00:00:03

RabbitMQ代码延迟队列

2023-04-27 07:43:22

RabbitMQ重试队列死信队列

2023-01-30 08:12:53

订单超时自动取消延长订单

2022-12-01 08:25:03

订单超时定时任务

2024-07-16 18:05:19

延迟队列MQRabbitMQ

2019-02-25 15:44:16

开源RabbitMQSpring Clou

2024-05-08 14:49:22

Redis延迟队列业务

2024-05-16 08:10:17

RabbitMQ软件通信机制

2024-08-27 13:43:38

Spring系统业务
点赞
收藏

51CTO技术栈公众号