RabbitMQ - 延迟消息 - 死信交换机
创始人
2024-12-27 04:38:12
0

目录

1、怎么理解延迟消息?

2、如何实现延迟消息?

2.1、方案一:死信交换机

2.1.1、什么是死信:

 2.1.2、什么是死信交换机?

2.2、方案二:延迟消息插件

2.2.1、插件安装:

2.2.2、代码实现


1、怎么理解延迟消息?

  • 延迟消息:生产者发送消息时指定一个时间,消费者不会立刻收到消息,而是在指定时间之后才收到消息
  • 延时任务:设置在一定时间之后才执行的任务

2、如何实现延迟消息?

2.1、方案一:死信交换机

2.1.1、什么是死信:

        当一个队列中的消息满足下列情况之一时,就会成为死信(Dead Letter):        

  • 消费者使用basic.reject或basic.nack声明消费失败,并且消息的Requeue参数设置为false
  • 消息是一个过期消息(达到了队列或消息本身设置的过期时间),超时无人消费
  • 要投递的队列消息堆积满了(可以给队列设置一个消息上限),最早的消息可能成为死信       

 2.1.2、什么是死信交换机?

        如果队列通过dead-letter-exchange属性指定了一个交换机,那么该队列中的死信就会投递到这个交换机中。这个交换机称为死信交换机(Dead Letter Exchange,简称DLX)

如图理解:

        图解: 我们发一个消息,过期时间为30s,由于simple.queue没有消费者,时间到了之后,simple.queue就会把死信投递给dlx.direct交换机~

(官方推出的死信交换机并不是用来实现延迟消息的,而是用做一些兜底方案,方便人工介入的~)

2.2、方案二:延迟消息插件

        RabbitMQ的官方推出一个插件,原生支持延迟消息功能。该插件的原理是设计了一种支持延迟消息功能的交换机,当消息投递到交换机后可以暂存一定时间,到期后再投递到队列中~

2.2.1、插件安装:

官网:Community Plugins | RabbitMQ

提示:RabbitMQ是什么版本的,下载的插件就得是什么版本的,得对应上

等待下载,下载好了之后,把这个插件传输到服务器上,放在哪儿?

把他放在官网提示的目录下:

我把目录已经挂载了,就使用本地目录啦~

放到指定目录后执行一条命令:

docker exec -it mq rabbitmq-plugins enable rabbitmq_delayed_message_exchange

执行完毕后,验证是否安装成功:

2.2.2、代码实现

声明延迟交换机的两个方案:

方案一:注解:

@RabbitListener(bindings = @QueueBinding(         value = @Queue(name = "delay.queue", durable = "true"),         exchange = @Exchange(name = "delay.direct", delayed = "true"),         key = "delay" )) public void listenDelayMessage(String msg){     log.info("接收到delay.queue的延迟消息:{}", msg); }

方案二:@Bean:

package com.itheima.consumer.config;  import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;  @Slf4j @Configuration public class DelayExchangeConfig {      @Bean     public DirectExchange delayExchange(){         return ExchangeBuilder                 .directExchange("delay.direct") // 指定交换机类型和名称                 .delayed() // 设置delay的属性为true                 .durable(true) // 持久化                 .build();     }      @Bean     public Queue delayedQueue(){         return new Queue("delay.queue");     }          @Bean     public Binding delayQueueBinding(){         return BindingBuilder.bind(delayedQueue()).to(delayExchange()).with("delay");     } } 

发送延迟消息
发送消息时,必须通过x-delay属性设定延迟时间:

@Test void testPublisherDelayMessage() {     // 1.创建消息     String message = "hello, delayed message";     // 2.发送消息,利用消息后置处理器添加消息头     rabbitTemplate.convertAndSend("delay.direct", "delay", message, new MessagePostProcessor() {         @Override         public Message postProcessMessage(Message message) throws AmqpException {             // 添加延迟消息属性             message.getMessageProperties().setDelay(5000);             return message;         }     }); }

相关内容

热门资讯

教材外挂透视wepoker怎么... 教材外挂透视wepoker怎么提高运气,wepoker辅助分析器-哔哩哔哩1、下载安装好wepoke...
第7分钟带你发现!兄弟十三水辅... 第7分钟带你发现!兄弟十三水辅助(辅助挂)其实是有挂的(详细教程)-哔哩哔哩;1、很好的兄弟十三水辅...
资料外挂透视aapoker辅助... 资料外挂透视aapoker辅助软件合法吗,wepoker怎么挂底牌-哔哩哔哩;无需打开直接搜索加薇1...
第四分钟带你解说!微信小游戏辅... 第四分钟带你解说!微信小游戏辅助器(辅助挂)一贯是有挂(有挂分析)-哔哩哔哩;微信小游戏辅助器是一项...
窍要外挂透视哈糖大菠萝万能挂,... 窍要外挂透视哈糖大菠萝万能挂,hhpoker免费透视脚本-哔哩哔哩【无需打开直接搜索加薇136704...
三分钟带你发现!决战卡五星辅助... 三分钟带你发现!决战卡五星辅助源码(辅助挂)原来真的是有挂(有挂技巧)-哔哩哔哩;1.决战卡五星辅助...
要领外挂透视拱趴大菠萝机器人,... 要领外挂透视拱趴大菠萝机器人,hhpoker德州牛仔视频-哔哩哔哩1、下载安装好hhpoker德州牛...
第九分钟带你普及!四川游戏家园... 第九分钟带你普及!四川游戏家园万能辅助工具(辅助挂)一直是有挂的(有挂详细)-哔哩哔哩;致您一封信;...
绝活儿外挂透视wepoker插... 绝活儿外挂透视wepoker插件功能辅助器,淘宝买wepoker透视有用吗-哔哩哔哩;无需打开直接搜...
第一分钟带你普及!微信小程序辅... 第一分钟带你普及!微信小程序辅助有哪些(辅助挂)一贯真的有挂(有挂秘笈)-哔哩哔哩;是一款可以让一直...