因为延迟队列的需求非常多,所以RabbitMQ的官方也推出了一个插件,原生支持延迟队列效果。
这个插件就是DelayExchange插件。参考RabbitMQ的插件列表页面:Community Plugins — RabbitMQ
1.将插件下载下来后,将插件上传到任意位置都可,我是默认上传到 了 根目录下:
2.复制插件到docker容器的rabbitmq容器的插件文件夹下
docker cp ./rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez 86310ba5518c:/plugins
3.进入容器,查看是否拷贝成功,并启动插件
进入容器
docker exec -it 86310ba5518c bash
cd plugins
ls
启动插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
在管理页面看到对应的交换机类型 证明安装插件并启动成功。
4.声明DelayExchange交换机和消息队列
( ̄(工) ̄)🐻代码如下:
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QueueCJ {
//交换机名称
public static final String CJ_EXCHANGE = "cj_exchange";
//消息队列名称
public static final String CJ_QUEUE = "cj_queue";
//声明DelayExchange交换机
@Bean(CJ_EXCHANGE)
public DirectExchange cjExchange() {
//与普通交换机唯一的不同就是 .delayed() 声明它是一个延迟交换机
return (DirectExchange) ExchangeBuilder.directExchange(CJ_EXCHANGE).delayed().durable(true).build();
}
//声明消息队列
@Bean(CJ_QUEUE)
public Queue cjQueue() {
return new Queue(CJ_QUEUE, true);
}
//绑定交换机和消息队列
@Bean
public Binding bindingCJQueue(@Qualifier(CJ_EXCHANGE) DirectExchange directExchange ,@Qualifier(CJ_QUEUE) Queue queue) {
return BindingBuilder.bind(queue).to(directExchange).with(CJ_EXCHANGE);
}
}
5.发送消息:
( ̄(工) ̄)🐻代码如下:
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 测试插件模式延迟队列
* @throws UnsupportedEncodingException
*/
@Test
public void senTTLDLX() throws UnsupportedEncodingException {
System.out.println(new Date());
String str = "{'id' :'2'}";
Message message = MessageBuilder.withBody(str.getBytes("utf-8"))
.setHeader("x-delay",1000).build();
//指定key
rabbitTemplate.convertAndSend(QueueCJ.CJ_EXCHANGE,QueueCJ.CJ_EXCHANGE,message);
}
6.监听消息
( ̄(工) ̄)🐻代码如下:
@RabbitListener(queues = {QueueCJ.CJ_QUEUE})
public void listener(@Payload Object msg) throws UnsupportedEncodingException {
System.out.println(new Date());
Message message = (Message) msg;
String str = new String(message.getBody(),"utf-8");
System.out.println("str = " + str);
}
总结:
延迟队列插件的使用步骤包括哪些?
•声明一个交换机,添加delayed属性为true
•发送消息时,添加x-delay头,值为超时时间
该插件可以解决死信队列的先进先出限制的问题,没有了死信队列,直接是将消息发送给交换机的,该交换机可以将消息进行保存等待死亡时间到了,直接路由给队列,消费者就可以监听到消息了,延迟插件时牛逼啊!!!!!