1.下载延迟插件并安装
在官网上下载 https://www.rabbitmq.com/community-plugins.html,下载
rabbitmq_delayed_message_exchange 插件,然后解压放置到 RabbitMQ 的插件目录。
进入 RabbitMQ 的安装目录下的 plgins 目录,执行下面命令让该插件生效,然后重启 RabbitMQ
/usr/lib/rabbitmq/lib/rabbitmq_server-3.8.8/plugins
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
2.配置
package com.mq.rabbit.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;
import java.util.Map;
@Configuration
public class DelayedQueueConfig {
// 交换机
private static final String DELAYED_EXCHANGE_NAME = "delayed.exchange";
// 队列
private static final String DELAYED_QUEUE_NAME = "delayed.queue";
// routingKey
private static final String DELAYED_ROUTING_KEY = "delayed.routingkey";
// 声明交换机
@Bean
public CustomExchange customExchange() {
Map<String, Object> arguments = new HashMap<>();
/**
* 参数说明:
* 1.交换机的名称
* 2.交换机的类型
* 3.是否需要持久化
* 4.是否自动删除
* 5.其它参数
*/
arguments.put("x-delayed-type", "direct");
return new CustomExchange(DELAYED_EXCHANGE_NAME,"x-delayed-message", true, false, arguments);
}
// 声明队列
@Bean
public Queue delayedQueue() {
return new Queue(DELAYED_QUEUE_NAME);
}
// 绑定
@Bean
public Binding delayedQueueBindingDelayedExchange(
@Qualifier("delayQueue") Queue delayedQueue,
@Qualifier("delayedExchange") CustomExchange delayedExchange
) {
return BindingBuilder.bind(delayedQueue).to(delayedExchange).with(DELAYED_ROUTING_KEY).noargs();
}
}
3.生产者
// 开始发消息 基于插件的消息及延迟时间
@GetMapping("/sendDelayMsg/{message}/{delayTime}")
public void sendMsg(@PathVariable String message, @PathVariable Integer delayTime) {
log.info("当前时间:{},发送一条时长{}毫秒信息给延迟队列:{}", new Date().toString(), delayTime, message);
rabbitTemplate.convertAndSend("delayed.exchange", "delayed.routingkey", message, msg -> {
// 发送消息的时候 延迟时长
msg.getMessageProperties().setDelay(delayTime);
return msg;
});
}
4.消费者
package com.mq.rabbit.consumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 消费者:基于插件的延迟消息
*/
@Component
@Slf4j
public class DelayQueueConsumer {
// 监听消息
@RabbitListener(queues = "delayed.queue")
public void receiveDelayQueue(Message message) {
String msg = new String(message.getBody());
log.info("当前时间{}, 收到延迟消息的队列:{},", new Date().toString(), message);
}
}
5.访问
http://localhost:8080/ttl/sendExpirationMsg/你好 1/20000
http://localhost:8080/ttl/sendExpirationMsg/你好 2/2000