延时队列优化 (2)

简介: 在这里新增了一个队列QC,绑定关系如下,该队列不设置TTL时间

在这里新增了一个队列QC,绑定关系如下,该队列不设置TTL时间


108f78c2e8f54acda1959610ef7af1a4.png


配置类文件:


@Bean("queueC")
    public Queue queueC()
    {
        HashMap<String, Object> args = new HashMap<String, Object>();
        args.put("x-dead-letter-exchange",Y_DEAD_LETTER_EXCHANGE);
        args.put("x-dead-letter-routing-key","YD");
        //在这里没有声明TTL属性
        return  QueueBuilder.durable(QUEUE_C).withArguments(args).build();
    }
    @Bean
    public Binding queueBindingX(@Qualifier("queueC") Queue queueC,@Qualifier("xExchange") DirectExchange exchange)
    {
        return BindingBuilder.bind(queueC).to(exchange).with("XC");
    }


生产者:


@Slf4j
@RequestMapping("ttl")
@RestController
public class Produce01 {
    @Autowired
    private RabbitTemplate rabbitTemplate;
//    @GetMapping("sendMsg/{message}")
//    public void sendMsg(@PathVariable String message)
//    {
//
//        log.info("当前时间:{},发送一条消息给俩个TTL队列:{}", new Date(),message);
//        rabbitTemplate.convertAndSend("X","XA","消息来于10s"+message);
//        rabbitTemplate.convertAndSend("X","XB","消息来于40s"+message);
//    }
    @GetMapping("sendExpirationMsg/{message}/{ttlTime}")
    public void senMsg(@PathVariable String message,@PathVariable  String ttlTime)
    {
        log.info("当前时间:{},发送一条时长{}毫秒TTL信息给队列C:{}", new Date(),ttlTime, message);
        rabbitTemplate.convertAndSend("X","XC",message, correlationData ->{
            correlationData.getMessageProperties().setExpiration(ttlTime);
            return correlationData;
        });
    }
}


消费者:


@Slf4j
@Component
public class Consumer {
    @RabbitListener(queues = "QD")
    public void receiveD(Message message, Channel channel)
    {
        String s = new String(message.getBody());
        log.info("当前时间{},死信队列D接收到消息---->{}",new Date(),s);
    }
}

5a459081abab43bc964314effee3b634.png18c9cfee95344ad2abbb4456d2ad6651.png


看起来似乎没什么问题,但是在最开始的时候,就介绍过如果使用在消息属性上设置TTL的方式,消息可能并不会按时“死亡“,因为RabbitMQ只会检查第一个消息是否过期,如果过期则丢到死信队列,


如果第一个消息的延时时长很长,而第二个消息的延时时长很短,第二个消息并不会优先得到执行。


相关文章
|
存储 消息中间件 NoSQL
延时消息常见实现方案
延时消息常见实现方案
延时消息常见实现方案
|
16天前
|
设计模式 NoSQL Go
Redis 实现高效任务队列:异步队列与延迟队列详解
本文介绍了如何使用 Redis 实现异步队列和延迟队列。通过 Go 语言的 `github.com/go-redis/redis` 客户端,详细讲解了 Redis 客户端的初始化、异步队列的实现和测试、以及延迟队列的实现和测试。文章从基础连接开始,逐步构建了完整的队列系统,帮助读者更好地理解和应用这些概念,提升系统的响应速度和性能。
37 6
|
3月前
|
存储 消息中间件 NoSQL
高可用延迟队列设计与实现
高可用延迟队列设计与实现
|
6月前
|
消息中间件 数据库
七、延时队列
七、延时队列
79 0
|
传感器 算法
RTOS中相对延时和绝对延时的区别
RTOS中相对延时和绝对延时的区别
116 1
|
消息中间件 Java 数据库
RibbitMQ学习笔记延迟队列(一)
RibbitMQ学习笔记延迟队列
69 0
|
消息中间件 存储 NoSQL
RibbitMQ学习笔记延迟队列(二)
RibbitMQ学习笔记延迟队列
91 0
|
数据库
每日一博 - 使用环形队列实现高效的延时消息
每日一博 - 使用环形队列实现高效的延时消息
79 0
|
消息中间件 Java Kafka
15、RabbitMQ没有延时队列?学会这一招玩转延时队列
15、RabbitMQ没有延时队列?学会这一招玩转延时队列
245 0
15、RabbitMQ没有延时队列?学会这一招玩转延时队列
|
消息中间件 Java Kafka
RabbitMQ没有延时队列?我就教你一招,玩转延时队列
延时队列:顾名思义,是一个用于做消息延时消费的队列。但是它也是一个普通队列,所以它具备普通队列的特性,相比之下,延时的特性就是它最大的特点。所谓的延时就是将我们需要的消息,延迟多久之后被消费。普通队列是即时消费的,延时队列是根据延时时间,多久之后才能消费的。