Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Rabbit 高级操作

Rabbit 高级操作

作者头像
张小驰出没
发布于 2021-12-06 08:44:44
发布于 2021-12-06 08:44:44
39600
代码可运行
举报
运行总次数:0
代码可运行

Rabbit 高级操作

1.过期时间TTL

过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了时间之后消息将自动被删除。

RabbitMQ可以对消息和队列设置TTL。目前有两种方法可以设置。

  • 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。
  • 第二种方法是对消息进行单独设置,每条消息TTL可以不同。

如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就称为dead message被投递到死信队列, 消费者将无法再收到该消息。

1.1 设置队列TTL

1.1.1 配置文件方式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">

    <!--定义过期队列及其属性,不存在则自动创建-->
    <rabbit:queue id="my_ttl_queue" name="my_ttl_queue" auto-declare="true">
        <rabbit:queue-arguments>
            <!--投递到该队列的消息如果没有消费都将在6秒之后被删除-->
            <entry key="x-message-ttl" value-type="long" value="6000"/>
        </rabbit:queue-arguments>
    </rabbit:queue>
    
</beans>
1.1.2 配置类方式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class RabbitMQConfig {
    @Bean("my_ttl_queue")
    public Queue queue() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("x-message-ttl", 6000); // 队列中的消息未被消费 10 秒后过期
        return new Queue("my_ttl_queue", true, false, false, map);
    }
}
1.1.3 创建测试类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootTest
@RunWith(SpringRunner.class)
public class ProducerTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    /**
     * 测试过期队列消息
     * 投递到该队列的消息如果没有消费都将在6秒之后被删除
     */
    @Test
    public void ttlQueueTest(){
        //路由键与队列同名
        rabbitTemplate.convertAndSend("my_ttl_queue", "发送到过期队列my_ttl_queue,6秒内不消费则过期。");
    }
}

运行之后,可以进入网站中查看该队列:

刚运行时:

运行6s后:

1.2 设置消息TTL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 过期消息
     * 该消息投递任何交换机或队列中的时候;如果到了过期时间则将从该队列中删除
     */
@Test
public void ttlMessageTest(){
    MessageProperties messageProperties = new MessageProperties();
    //设置消息的过期时间,5秒
    messageProperties.setExpiration("5000");
    Message message = new Message("测试过期消息,5秒钟过期".getBytes(), messageProperties);
    //路由键与队列同名
    rabbitTemplate.convertAndSend("my_ttl_queue", message);
}

这样可以给这条message 设置过期时间,如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。所以会 5s 过期。

2.死信队列

DLX,全称为Dead-Letter-Exchange , 可以称之为死信交换机,也有人称之为死信邮箱。当消息在一个队列中变成死信(dead message)之后,它能被重新发送到另一个交换机中,这个交换机就是DLX ,绑定DLX的队列就称之为死信队列。

消息变成死信,可能是由于以下的原因:

  • 消息被拒绝
  • 消息过期
  • 队列达到最大长度

DLX也是一个正常的交换机,和一般的交换机没有区别,它能在任何的队列上被指定,实际上就是设置某一个队列的属性。当这个队列中存在死信时,Rabbitmq就会自动地将这个消息重新发布到设置的DLX上去,进而被路由到另一个队列,即死信队列。

要想使用死信队列,只需要在定义队列的时候设置队列参数 x-dead-letter-exchange 指定交换机即可。

2.1 配置文件方法

2.1.1 消息过期情况
定义死信队列
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--定义定向交换机中的持久化死信队列,不存在则自动创建-->
<rabbit:queue id="my_dlx_queue" name="my_dlx_queue" auto-declare="true"/>
<!--定义广播类型交换机;并绑定队列-->
<rabbit:direct-exchange id="my_dlx_exchange" name="my_dlx_exchange" auto-declare="true">
    <rabbit:bindings>
        <!--绑定路由键my_ttl_dlx,可以将过期的消息转移到my_dlx_queue队列-->
        <rabbit:binding key="my_ttl_dlx" queue="my_dlx_queue"/>
    </rabbit:bindings>
</rabbit:direct-exchange>
队列设置死信交换机
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--定义过期队列及其属性,不存在则自动创建-->
<rabbit:queue id="my_ttl_dlx_queue" name="my_ttl_dlx_queue" auto-declare="true">
    <rabbit:queue-arguments>
        <!--投递到该队列的消息如果没有消费都将在6秒之后被投递到死信交换机-->
        <entry key="x-message-ttl" value-type="long" value="6000"/>
        <!--设置当消息过期后投递到对应的死信交换机-->
        <entry key="x-dead-letter-exchange" value="my_dlx_exchange"/>
    </rabbit:queue-arguments>
</rabbit:queue>
<!--定义定向交换机 根据不同的路由key投递消息-->
<rabbit:direct-exchange id="my_normal_exchange" name="my_normal_exchange" auto-declare="true">
    <rabbit:bindings>
        <rabbit:binding key="my_ttl_dlx" queue="my_ttl_dlx_queue"/>
    </rabbit:bindings>
</rabbit:direct-exchange>
2.1.2 消息队列过长情况
定义死信队列
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--定义定向交换机中的持久化死信队列,不存在则自动创建-->
<rabbit:queue id="my_dlx_queue" name="my_dlx_queue" auto-declare="true"/>
<!--定义广播类型交换机-->
<rabbit:direct-exchange id="my_dlx_exchange" name="my_dlx_exchange" auto-declare="true">
    <rabbit:bindings>
        <!--绑定路由键my_max_dlx-->
        <rabbit:binding key="my_max_dlx" queue="my_dlx_queue"/>
    </rabbit:bindings>
</rabbit:direct-exchange>
队列设置死信交换机
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--定义限制长度的队列及其属性,不存在则自动创建-->
<rabbit:queue id="my_max_dlx_queue" name="my_max_dlx_queue" auto-declare="true">
    <rabbit:queue-arguments>
        <!--投递到该队列的消息最多2个消息,如果超过则最早的消息被删除投递到死信交换机-->
        <entry key="x-max-length" value-type="long" value="2"/>
        <!--设置当消息过期后投递到对应的死信交换机-->
        <entry key="x-dead-letter-exchange" value="my_dlx_exchange"/>
    </rabbit:queue-arguments>
</rabbit:queue>
<!--定义定向交换机 根据不同的路由key投递消息-->
<rabbit:direct-exchange id="my_normal_exchange" name="my_normal_exchange" auto-declare="true">
    <rabbit:bindings>
        <rabbit:binding key="my_max_dlx" queue="my_max_dlx_queue"/>
    </rabbit:bindings>
</rabbit:direct-exchange>

2.2 配置类方式

2.2.1 消息过期情况
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class RabbitMQConfig {
     /**
     * 声明死信交换机
     *
     * @return 返回
     */
    @Bean("my_dlx_exchange")
    public DirectExchange myDlxExchange() {
        return new DirectExchange("my_dlx_exchange", true, false, new HashMap<>());
    }
    /**
     * 声明死信队列
     *
     * @return 返回
     */
    @Bean("my_dlx_queue")
    public Queue myDlxQueue() {
        return new Queue("my_dlx_queue", true, false, false, new HashMap<>());
    }
    /**
     * 绑定队列,设置路由key
     *
     * @param queue          参数
     * @param directExchange 参数
     * @return 返回
     */
    @Bean
    public Binding bindingDead(@Qualifier("my_dlx_queue") Queue queue, @Qualifier("my_dlx_exchange") DirectExchange directExchange) {
        return BindingBuilder.bind(queue).to(directExchange).with("my_ttl_dlx");
    }
    /**
     * 声明过期队列
     *
     * @return 返回
     */
    @Bean("my_ttl_dlx_queue")
    public Queue myTtlDlxQueue() {
        Map<String, Object> map = new HashMap<>();
        //6s后队列过期
        map.put("x-message-ttl", 6000);
        //消息过期后,进入死信交换机
        map.put("x-dead-letter-exchange", "my_dlx_exchange");
        return new Queue("my_ttl_dlx_queue", true, false, false, map);
    }
    /**
     * 声明交换机
     *
     * @return 返回
     */
    @Bean("my_normal_exchange")
    public DirectExchange myNormalExchange() {
        return new DirectExchange("my_normal_exchange", true, false, new HashMap<>());
    }
    /**
     * 交换机绑定过期队列
     *
     * @param queue          参数
     * @param directExchange 参数
     * @return 返回
     */
    @Bean
    public Binding binding(@Qualifier("my_ttl_dlx_queue") Queue queue, @Qualifier("my_normal_exchange") DirectExchange directExchange) {
        return BindingBuilder.bind(queue).to(directExchange).with("my_ttl_dlx");
    } 
}
2.2.2 消息过长情况
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class RabbitMQConfig {
    /**
     * 声明死信交换机
     *
     * @return 返回
     */
    @Bean("my_dlx_exchange")
    public DirectExchange myDlxExchange() {
        return new DirectExchange("my_dlx_exchange", true, false, new HashMap<>());
    }
    /**
     * 声明死信队列
     *
     * @return 返回
     */
    @Bean("my_dlx_queue")
    public Queue myDlxQueue() {
        return new Queue("my_dlx_queue", true, false, false, new HashMap<>());
    }
    /**
     * 绑定队列,设置路由key
     *
     * @param queue          参数
     * @param directExchange 参数
     * @return 返回
     */
    @Bean
    public Binding bindingDead(@Qualifier("my_dlx_queue") Queue queue, @Qualifier("my_dlx_exchange") DirectExchange directExchange) {
        return BindingBuilder.bind(queue).to(directExchange).with("my_max_dlx");
    }
   /**
     * 声明过长队列
     *
     * @return 返回
     */
    @Bean("my_max_dlx_queue")
    public Queue myMaxDlxQueue(){
        Map<String, Object> map = new HashMap<>();
        //设置消息过长
        map.put("x-max-length",2);
        //消息过长后,进入死信队列
        map.put("x-dead-letter-exchange","my_dlx_exchange");
        return new Queue("my_max_dlx_queue",true,false,false,map);
    }
    /**
     * 声明交换机
     *
     * @return 返回
     */
    @Bean("my_normal_exchange")
    public DirectExchange myNormalExchange() {
        return new DirectExchange("my_normal_exchange", true, false, new HashMap<>());
    }
    /**
     * 消息过长   交换机绑定过期队列
     *
     * @param queue          参数
     * @param directExchange 参数
     * @return 返回
     */
    @Bean
    public Binding binding2(@Qualifier("my_max_dlx_queue") Queue queue, @Qualifier("my_normal_exchange") DirectExchange directExchange) {
        return BindingBuilder.bind(queue).to(directExchange).with("my_max_dlx");
    }
}

2.3 死信队列测试

2.3.1 测试消息过期情况
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 过期消息投递到死信队列
     * 投递到一个正常的队列,但是该队列有设置过期时间,到过期时间之后消息会被投递到死信交换机(队列)
     */
@Test
public void dlxTTLMessageTest(){
    rabbitTemplate.convertAndSend("my_normal_exchange", "my_ttl_dlx", "测试过期消息;6秒过期后会被投递到死信交换机");
}

刚运行时:

6s之后:

2.3.2 测试消息过长情况
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 超过队列长度消息投递到死信队列
     * 投递到一个正常的队列,但是该队列有设置最大消息数,到最大消息数之后队列中最早的消息会被投递到死信交换机(队列)
     */
@Test
public void dlxMaxMessageTest(){
    rabbitTemplate.convertAndSend("my_normal_exchange", "my_max_dlx",
                                  "队列my_max_dlx_queue的最大长度为2;消息超过后会被投递到死信交换机;这是第1个消息");
    rabbitTemplate.convertAndSend("my_normal_exchange", "my_max_dlx",
                                  "队列my_max_dlx_queue的最大长度为2;消息超过后会被投递到死信交换机;这是第2个消息");
    rabbitTemplate.convertAndSend("my_normal_exchange", "my_max_dlx",
                                  "队列my_max_dlx_queue的最大长度为2;消息超过后会被投递到死信交换机;这是第3个消息");
}

发送了三条信息,而设置的消息队列长度为2,这样最先发送的第1个消息会进入死信队列:

3.延迟队列

延迟队列存储的对象是对应的延迟消息;所谓“延迟消息” 是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。在RabbitMQ中延迟队列可以通过 过期时间 + 死信队列 来实现;

3.1 生产者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Producer {
    //交换机名称
    static final String MY_DLX_EXCHANGE = "my_dlx_exchange";
    static final String MY_NORMAL_EXCHANGE = "my_normal_exchange";
    //队列名称
    static final String MY_DLX_QUEUE = "my_dlx_queue";
    static final String MY_TTL_DLX = "my_ttl_dlx";
    public static void main(String[] args) throws Exception {
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.57.129");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        connectionFactory.setVirtualHost("/");
        Connection connection = connectionFactory.newConnection();
        Channel channel = connection.createChannel();
        //声明死信交换机
        channel.exchangeDeclare(MY_DLX_EXCHANGE, BuiltinExchangeType.DIRECT);
        //声明一个队列
        channel.queueDeclare(MY_DLX_QUEUE, true, false, false, null);
        //绑定
        channel.queueBind(MY_DLX_QUEUE, MY_DLX_EXCHANGE, "my_ttl_dlx");
        //声明工作交换机
        channel.exchangeDeclare(MY_NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        //声明工作队列
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("x-message-ttl", 6000);
        map.put("x-dead-letter-exchange", MY_DLX_EXCHANGE);
        channel.queueDeclare("my_ttl_dlx", true, false, false, map);
        //绑定
        channel.queueBind(MY_TTL_DLX, MY_NORMAL_EXCHANGE, "my_ttl_dlx");

        String message = LocalDateTime.now() + ",延迟6s的消息";
        channel.basicPublish(MY_NORMAL_EXCHANGE, "my_ttl_dlx", null, message.getBytes());
        System.out.println("发送消息为::" + message);

        channel.close();
        connection.close();
    }
}

3.2 消费者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Consumer {
    public static void main(String[] args) throws Exception {
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.57.129");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        connectionFactory.setVirtualHost("/");
        Connection connection = connectionFactory.newConnection();
        Channel channel = connection.createChannel();
        channel.exchangeDeclare(Producer.MY_DLX_EXCHANGE, BuiltinExchangeType.DIRECT);
        channel.queueDeclare(Producer.MY_DLX_QUEUE,true,false,false,null);
        channel.queueBind(Producer.MY_DLX_QUEUE,Producer.MY_DLX_EXCHANGE,"my_ttl_dlx");
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消费者收到消息:" + new String(body,"utf-8")+",当前时间:"+ LocalDateTime.now());
                channel.basicAck(envelope.getDeliveryTag(), false);
            }
        };
        channel.basicConsume(Producer.MY_DLX_QUEUE, false, consumer);
    }
}

3.3 测试

先启动 消费者 ,开启监听,在启动 生产者 发送消息。

这时候可能出现错误:

这个问题是因为你创建的交换机已经存在,可以去rabbitmq网站中,删除对应交换机。

再次运行就成功了:

个人博客为: MoYu’s HomePage

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/09/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RabbitMQ之死信队列解读
主启动类RabbitMq01Application:实现ApplicationRunner接口
一个风轻云淡
2023/10/12
7870
RibbitMQ学习笔记延迟队列
延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。
默 语
2024/11/20
760
RibbitMQ学习笔记延迟队列
面试官:谈谈RabbitMQ的队头阻塞问题?
RabbitMQ 延迟消息的队头阻塞问题是指,在使用死信队列(DLX)和 TTL(消息过期时间)实现延迟消息时,由于队列的先进先出(FIFO)特性,在队列头部消息未过期的情况下,即使后续消息已经过期也不能及时处理的情况。
磊哥
2025/02/19
910
面试官:谈谈RabbitMQ的队头阻塞问题?
一文搞懂Spring-AMQP
12//设置消息发送ack,默认noneconnectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED);
爱撒谎的男孩
2020/03/11
1.2K0
RabbitMQ延迟消费和重复消费
转载自 https://blog.csdn.net/quliuwuyiz/article/details/79301054
allsmallpig
2021/02/25
2.4K0
RabbitMQ高级特性:死信队列
死信队列,英文缩写DLX,Dead Letter Exchange(死信交换机),当消息成为Dead message(消息过期)后,可以被重新发送到另一个交换机,这个交换机就算是DLX,其实死信交换机(队列)和正常交换机(队列)没有什么区别
科技新语
2023/04/07
2.7K0
浅析RabbitMQ的延迟队列
这些场景都有一个特点,需要在某个事件发生之后或者之前的指定时间点完成某一项任务,如:发生订单生成事件,在十分钟之后检查该
小熊学Java
2023/07/16
4060
浅析RabbitMQ的延迟队列
RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)
RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)
Java廖志伟
2022/03/07
7540
RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)
【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列
目前有俩种方式可以设置消息的TTL 一是设置队列的TTL,队列中所有消息都有相同的过期时间.
用户11369558
2024/11/25
3910
【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列
15-RabbitMQ高级特性-死信队列
死信队列,英文缩写:DLX 。Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。
Devops海洋的渔夫
2023/02/10
9950
15-RabbitMQ高级特性-死信队列
RabbitMQ 如何实现延迟队列?答案可不止一种
RabbitMQ 本身不支持延迟消息,但是可以通过它提供的两个特性 TTL(Time-To-Live and Expiration ,消息存活时间)、DLX(Dead Letter Exchanges,死信交换器) 来实现。还可以利用 RabbitMQ 插件来实现。
程序员鱼皮
2024/08/20
5110
RabbitMQ 如何实现延迟队列?答案可不止一种
RabbitMQ高级特性之延迟队列
很多时候我们想定时去做某件事情的时候我们会首先想到定时任务,quartz是个不错的选择,但是也有缺点,假如配置在项目中,集群部署会有重复执行的问题,如果持久化在mysql中,解决了集群的问题,但是过于依赖mysql,耦合严重,当然还有日志量庞大、执行时间精度、过于耗费系统资源等等问题。所以这时候使用消息队列中间件的的延时队列就是一个很好得解决方案,我们设置要触发消费的时间和必要的参数入队mq,到时监听queue的消费者自然拿到消息然后去走业务流程,这里介绍的是基于rabbitmq中间件实现的TTL版的延时队列。
黎明大大
2021/03/25
1.2K0
RabbitMQ高级特性之延迟队列
RabbitMQ 延迟队列实现定时任务
开发中经常需要用到定时任务,对于商城来说,定时任务尤其多,比如优惠券定时过期、订单定时关闭、微信支付2小时未支付关闭订单等等,都需要用到定时任务,但是定时任务本身有一个问题,一般来说我们都是通过定时轮询查询数据库来判断是否有任务需要执行。
用户4283147
2022/10/27
4690
RabbitMQ 延迟队列实现定时任务
16-RabbitMQ高级特性-延迟队列
16-RabbitMQ高级特性-延迟队列 延迟队列 延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。 需求: 下单后,30分钟未支付,取消订单,回滚库存。 新用户注册成功7天后,发送短信问候。 实现方式: 对于上面两种需求,一般有两种实现方式: 定时器 延迟队列 定时器:设置一个轮询时间,间隔一段时间对数据库进行扫描对比,当符合定时的数据则进行处理; 缺点: 不优雅,因为不管设置多少间隔时间,都会对数据库产生多次扫描的执行,影响性能; 而且间隔的时间范围对具体时间点存在一定的误差
Devops海洋的渔夫
2023/02/10
3810
16-RabbitMQ高级特性-延迟队列
03、RabbitMQ延迟队列(死信交换机)
天蝎座的程序媛
2023/10/17
2800
03、RabbitMQ延迟队列(死信交换机)
rabbitMQ延时队列——TTL和DLX
     采取定时任务轮训数据库订单,并且批量处理。其弊端也是显而易见的;对服务器、数据库性会有很大的要求,  并且当处理大量订单起来会很力不从心,而且实时性也不是特别好。当然传统的手法还可以再优化一下,      即存入订单的时候就算出订单的过期时间插入数据库,设置定时任务查询数据库的时候就只需要查询过期了的订单,      然后再做其他的业务操作 
用户10196776
2023/10/17
3930
rabbitMQ延时队列——TTL和DLX
RabbitMQ---延迟队列,整合springboot
延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。
大忽悠爱学习
2021/12/07
6570
RabbitMQ---延迟队列,整合springboot
近九万字的RabbitMQ图文详解
RabbitMQ 简介:RabbitMQ 基于 AMQP 标准,采用 Erlang 语言开发的消息中间件。
Java廖志伟
2022/03/07
1K0
近九万字的RabbitMQ图文详解
RabbitMQ 超详细入门篇
本人使用的是 阿里云服务器 没有的话也可以使用虚拟机… 事先使用连接工具上传了文件
Java_慈祥
2024/08/06
2.2K0
RabbitMQ 超详细入门篇
RabbitMQ 实现延迟队列的两种方式!
定时任务各种各样,常见的定时任务例如日志备份,我们可能在每天凌晨 3 点去备份,这种固定时间的定时任务我们一般采用 cron 表达式就能轻松的实现,还有一些比较特殊的定时任务,向大家看电影中的定时炸弹,3分钟后爆炸,这种定时任务就不太好用 cron 去描述,因为开始时间不确定,我们开发中有的时候也会遇到类似的需求,例如
江南一点雨
2021/12/09
7690
RabbitMQ 实现延迟队列的两种方式!
推荐阅读
相关推荐
RabbitMQ之死信队列解读
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验