rabbitmq高级特性之ttl存活时间/过期时间通俗易懂超详细内含案例(代码片段)

beixuan beixuan     2022-12-08     361

关键词:

RabbitMq高级特性之TTL 存活时间/过期时间

每条消息设置过期时间

整个 Queue 队列设置过期时间

前提

  1. 完成 RabbitMq高级特性之消费端限流

一、每条消息设置过期时间

1.更改ProducerTest.java文件

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class producerTest 

    @Resource
    private RabbitTemplate rabbitTemplate;

    @Test
    public void test()
        
        MessagePostProcessor messagePostProcessor = new MessagePostProcessor() 
            @Override
            public Message postProcessMessage(Message message) throws AmqpException 
                //设置消息 3秒后过期
                message.getMessageProperties().setExpiration("3000");
                return message;
            
        ;
    
        String routingKey = "item.insert";
    
        int count = 1;
        while (count <= 9)
            String message = "发送第"+count+"条消息";
            //log.debug("路由键:",routingKey);
            if (count % 3 == 0)
                //给其中的第3 6 9条消息添加过期时间
                rabbitTemplate.convertAndSend(RabbitConfig.DIRECT_EXCHANGE,"",message,messagePostProcessor);
             else 
                rabbitTemplate.convertAndSend(RabbitConfig.TOPIC_EXCHANGE_NAME,routingKey,message);
            
            count++;
        
        log.debug("发送成功");
    

二、整个 Queue 队列设置过期时间

1.更改RabbitMqConfig.java文件

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMq 配置类
 */
@Configuration
public class RabbitMqConfig 
    private static final String TOPIC_EXCHANGE_NAME = "topic_exchange";
    private static final String TOPIC_QUEUE_NAME = "topic_queue";

    /**
     * 创建 交换机
     * @return
     */
    @Bean
    public Exchange itemTopicExchange()
        return ExchangeBuilder.topicExchange(TOPIC_EXCHANGE_NAME).build();
    

    /**
     * 创建 队列
     * @return
     */
    @Bean
    public Queue itemQueue()
        //QueueBuilder.durable(TOPIC_QUEUE_NAME).withArgument("x-message-ttl",3000).build();
        //与下句代码 效果一致 写一个就可以
        return QueueBuilder.durable(TOPIC_QUEUE_NAME).ttl(3000).build();
    

    /**
     * 绑定 交换机与队列
     * @param exchange
     * @param queue
     * @return
     */
    @Bean
    public Binding itemQueueExchange(@Qualifier("itemTopicExchange") Exchange exchange, @Qualifier("itemQueue") Queue queue)
        return BindingBuilder.bind(queue).to(exchange).with("item.#").noargs();
    



三、测试

直接运行ProducerTest.java单元测试即可,为了达到自动过期,消费端不可启动

四、小结

两种模式可同时起作用,哪个时间短,就会执行哪个

Queue级别的过期时间一到,会自动丢掉消息,不会等到消费者来取消息.

Message级别的消息过期后,不会自动抹去,而是等到消费者获取消息时进行判断是否过期,如过期则丢掉.

rabbitmq高级特性之死信队列通俗易懂超详细内含案例(代码片段)

RabbitMq高级特性之死信队列又称死信交换机DLX当消息成为Deadmessage后,会重新发送到另一个交换机,这个交换机就是DLX消息成为死信的情况公有三种:队列消息长度达到限制消费者拒接消费消息basicNack/basicReject,并且不把消息重新放回... 查看详情

rabbitmq学习笔记5:rabbitmq高级

...都可以被消费者接收获取;过了之后消息将自动被删除。2.RabbitMQ可以对消息和队列设置TTL,目前有两种方法可以设置:第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。第二种方法是对消息进行单独设置,... 查看详情

rabbitmq之过期时间(ttl)

参考技术ATTL(TimeToLive),即过期时间。RabbitMQ可以对消息和队列设置TTL。两种方法可以设置消息的TTL:(1):通过队列属性设置,队列中所有消息都有相同的过期时间。(2):对消息本身进行单独设置,每条消息的TTL可以不同。注:如... 查看详情

rabbitmq消息过期时间(ttl)---2022-04-03

参考技术ARabbitMQ的消息过期时间(TTL)下面两种方式进行设置下面使用Golang进行演示如何设置,其他开发语言类似。通过队列属性(x-message-ttl)设置消息过期时间。通过消息属性设置消息过期时间 查看详情

springboot整合rabbitmq——设置消息过期时间ttl

主要有2种方式:指定一条消息的过期时间。给队列设置消息过期时间,队列中的所有消息都有同样的过期时间。1、指定消息的过期时间@RestControllerpublicclassTTLController{@AutowiredprivateRabbitTemplaterabbitTemplate;@PostMapping("/testTTL")publicStrin... 查看详情

rabbitmq中的消息会过期吗?(代码片段)

...殊情况3.死信队列3.1死信交换机3.2死信队列3.3实践4.小结RabbitMQ中的消息长期未被消费会过期吗?用过RabbitMQ的小伙伴可能都有这样的疑问,今天松哥就来和大家捋一捋这个问题。1.默认情况首先我们来看看默认情况。默认... 查看详情

rabbitmq延迟消息

 一、RabbitMQ的两个概念使用RabbitMQ来实现延迟消息必须先了解RabbitMQ的两个概念:消息的TTL和死信Exchange,通过这两者的组合来实现上述需求。 1、消息的TTL(TimeToLive)消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消... 查看详情

使用rabbitmq实现ttl机制

...消。这个怎么实现?TTL,TimetoLive的简称,即过期时间。RabbitMQ可以对消息和队列两个维度来设置TTL。任何消息中间件的容量和堆积能力都是有限的,如果有一些消息总是不被消费掉,那么需要有一种过期的机制来做兜底。目前有... 查看详情

过期消息传递序列 RabbitMQ

】过期消息传递序列RabbitMQ【英文标题】:ExpiredMessageDeliverySequenceRabbitMQ【发布时间】:2014-11-3003:20:19【问题描述】:我们正在构建一个将消息发布到超时队列的解决方案。在TTL到期后,消息被推送到主队列进行重新处理。我们... 查看详情

rabbitmq实现延时消息的两种方式

参考技术ARabbitmq实现延时消息的两种方式使用队列的ttl特性,即配置死信队列的消息重新路由到消费队列中,同一个队列的消息过期时间将相同,即使消息本身可能带上了ttl,同样会因队头的消息未过期而无法消费;定义两个队... 查看详情

rabbitmq延迟消息

 一、RabbitMQ的两个概念使用RabbitMQ来实现延迟消息必须先了解RabbitMQ的两个概念:消息的TTL和死信Exchange,通过这两者的组合来实现上述需求。 1、消息的TTL(TimeToLive)消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消... 查看详情

jvm高级特性-垃圾收集之判断对象存活算法

一、概述  运行时数据区中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭的  因此,他们的内存分配和回收是确定的,在方法或线程结束时就回收。而Java堆和方  法区则是不确定的,程序运行过程中... 查看详情

rabbitmq——rabbitmq的高级特性(ttl死信队列延迟队列优先级队列rpc)

摘要本博文将介绍数据可靠性的一些细节,并展示RabbitMQ的几种已具备或衍生的高级特性,包括TTL、死信队列、延迟队列、优先级队列、RPC等,这些功能在实际使用中可以让某些应用的实现变得事半功倍。同时对源码进行详细的... 查看详情

springboot与rabbitmq上手之消息超时时间、队列消息超时时间(五)

参考技术A目的主要是学习RabbitMQ的消息超时时间、队列消息超时时间,大概会简单介绍学习为主:毕竟还是要来演示Springboot整合RabbitMQ注解的方式来使用。每条消息的过期时间不同,如果要删除所有过期消息,势必要扫描整个队... 查看详情

rabbitmq队列(代码片段)

TTL队列如果设置了消息的过期时间,也设置了队列的过期时间,它以时间短的为准。队列过期后,会将队列中所有消息全部移除。消息属性设置TTL(消息单独过期)使用参数expiration(单位:ms毫秒)... 查看详情

rabbitmq队列(代码片段)

TTL队列如果设置了消息的过期时间,也设置了队列的过期时间,它以时间短的为准。队列过期后,会将队列中所有消息全部移除。消息属性设置TTL(消息单独过期)使用参数expiration(单位:ms毫秒)... 查看详情

mq-死信队列实现消息延迟(代码片段)

...之后,延迟指定的时间才能被消费者消费。AMQP协议和RabbitMQ队列本身是不支持延迟队列功能的,但是可以通过TTL(TimeToLive)特性模拟延迟队列的功能。TTL就是消息的存活时间,RabbitMQ可以分别对队列和消息设... 查看详情

rabbitmq项目使用之死信队列(代码片段)

...际上就是设置某个队列的属性,当这个队列中有死信时,RabbitMQ就会自动的将这个消息重新发布到设置的 查看详情