如何使用Java和RabbitMQ实现延迟队列(方式二)?

前言

昨天写了一篇关于Java和RabbitMQ使用插件实现延迟队列功能的文章,今天来讲下另外一种方式,不需要RabbitMQ的插件。

前期准备,需要安装好docker、docker-compose的运行环境。

需要安装RabbitMQ的可以看下面这篇文章。

如何使用PHP和RabbitMQ实现消息队列?-优快云博客

使用RabbitMQ插件实现延迟队列功能的文章,可以查看下面的文章。

如何使用Java和RabbitMQ实现延迟队列?-优快云博客

一、编写代码

1、使用springboot框架快速搭建一个项目。

2、在 pom.xml 中添加 Spring Boot AMQP 的依赖,内容如下。


<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-amqp</artifactId>  
</dependency>

3、在 application.yml 中配置 RabbitMQ 的连接信息,内容如下。

spring:
  rabbitmq:
    host: loca
### 延迟队列的定义 延迟队列是指将消息先放入队列中,但是并不立即消费该消息,而是在一定时间后再进行消费的队列。延迟队列可以用来解决某些需要经过一段时间才能处理的任务,例如超时未支付订单的关闭、定时发送消息等场景[^1]。 ### RabbitMQ实现延迟队列的方法 RabbitMQ本身没有延迟队列实现延迟消息一般有以下两种方式: - **通过RabbitMQ本身队列的特性实现**:需要使用RabbitMQ的死信交换机(Exchange)消息的存活时间TTL(Time To Live)。当消息在队列中存活的时间超过了TTL,消息就会成为死信,被转发到死信队列,从而实现延迟处理的效果[^3]。 - **使用插件实现**:在RabbitMQ 3.5.7及以上的版本提供了一个插件(rabbitmq - delayed - message - exchange)来实现延迟队列功能。同时,插件依赖Erlang/OPT 18.0及以上。该方式可以实现灵活的动态延迟,适用于电商、金融等高并发场景,关键步骤包括插件安装、交换机声明及消息延迟设置。若受环境限制,可选用TTL + 死信队列作为备选方案,但需注意其局限性。实际使用中需结合消息持久化、集群部署等手段保障可靠性[^3][^4]。 以下是使用TTL死信队列实现延迟队列的简单代码示例(基于Spring BootRabbitMQ): ```java import org.springframework.amqp.core.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.HashMap; import java.util.Map; @Configuration public class RabbitMQConfig { // 定义正常队列 public static final String NORMAL_QUEUE = "normal_queue"; // 定义死信队列 public static final String DEAD_LETTER_QUEUE = "dead_letter_queue"; // 定义正常交换机 public static final String NORMAL_EXCHANGE = "normal_exchange"; // 定义死信交换机 public static final String DEAD_LETTER_EXCHANGE = "dead_letter_exchange"; // 声明正常交换机 @Bean DirectExchange normalExchange() { return new DirectExchange(NORMAL_EXCHANGE); } // 声明死信交换机 @Bean DirectExchange deadLetterExchange() { return new DirectExchange(DEAD_LETTER_EXCHANGE); } // 声明正常队列并绑定死信交换机 @Bean Queue normalQueue() { Map<String, Object> args = new HashMap<>(); // 设置死信交换机 args.put("x-dead-letter-exchange", DEAD_LETTER_EXCHANGE); // 设置死信路由键 args.put("x-dead-letter-routing-key", "dead_letter_routing_key"); // 设置消息TTL args.put("x-message-ttl", 5000); return new Queue(NORMAL_QUEUE, true, false, false, args); } // 声明死信队列 @Bean Queue deadLetterQueue() { return new Queue(DEAD_LETTER_QUEUE, true); } // 绑定正常队列正常交换机 @Bean Binding normalBinding() { return BindingBuilder.bind(normalQueue()).to(normalExchange()).with("normal_routing_key"); } // 绑定死信队列死信交换机 @Bean Binding deadLetterBinding() { return BindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange()).with("dead_letter_routing_key"); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ayzen1988

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值