提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
RabbitMQ的TTL队列优化
前言
跟随B站尚硅谷的RabbtiMQ进行学习:
以下是B站RabbitMQ的视频:
RabbitMQ的TTL插件配置及实现
踩坑提示:建议跟随视频使用插件,你用的哪个版本的RabbitMQ就配置对应版本的插件。
插件的下载地址:
延时队列插件下载地址
提示:以下是本篇文章正文内容,下面案例可供参考
一、RabbitMQ插件实现延时队列
代码架构图:
二、代码实现DelayedExchange
1.配置文件类代码
在我们自定义的交换机中,这是一种新的交换类型,该类型消息支持延迟投递机制 消息传递后并不会立即投递到目标队列中,而是存储在 mnesia(一个分布式数据系统)表中,当达到投递时间时,才投递到目标队列中。
package com.xyh.springbootrabbitmq.Config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
@Configuration
public class DelayedQueueConfig {
public static final String DELAYED_QUEUE_NAME = "delayed.queue";
public static final String DELAYED_EXCHANGE_NAME = "delayed.exchange";
public static final String DELAYED_ROUTING_KEY = "delayed.routingKey";
@Bean("delayedQueue")
public Queue delayedQueue(){
return new Queue(DELAYED_QUEUE_NAME);
}
@Bean("delayedExchange")
public CustomExchange delayedExchange(){
HashMap<String, Object> args = new HashMap<>();
//自定义交换机类型
args.put("x-delayed-type","direct");
return new CustomExchange(DELAYED_EXCHANGE_NAME,"x-delayed-message",true,false,args);
}
@Bean
public Binding bindingDelayedQueue(@Qualifier("delayedQueue") Queue queue, @Qualifier("delayedExchange") CustomExchange delayedExchange){
return BindingBuilder.bind(queue).to(delayedExchange).with(DELAYED_ROUTING_KEY).noargs();
}
}
2.Producer发布消息
@GetMapping("sendDelayMsg/{message}/{delayTime}")
public void sendMsg2(@PathVariable String message,@PathVariable Integer delayTime){
rabbitTemplate.convertAndSend(DELAYED_EXCHANGE_NAME,DELAYED_ROUTING_KEY,message,correlationData->{
correlationData.getMessageProperties().setDelay(delayTime);
return correlationData;
});
System.out.println("发送一条信息给两个TTL队列:"+"发布时间:"+new Date()+"消息内容:"+message+" delayTime: "+delayTime);
}
3.Consumer消费消息
package com.xyh.springbootrabbitmq.consumer;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class receiveDelayedQueue {
public static final String DELAYED_QUEUE_NAME = "delayed.queue";
@RabbitListener(queues = DELAYED_QUEUE_NAME)
public void receiveQueue(Message message){
String s = new String(message.getBody());
System.out.println("收到死信队列信息:"+"发布时间:"+new Date()+"消息内容:"+s);
}
}
三、运行结果
MQ管理页面生成Queue:
idea控制台实现消息接收:发现延时时间小的先被消费掉