1、RabbitMQ服务安装延时消息插件【rabbitmq_delayed_message_exchange】
Windows为例:下载延时消息插件:Community Plugins | RabbitMQ
把 下载下来的文件拷贝到RabbitMQ安装目录下的 plugins 目录。
进入RabbitMQ安装目录下的 sbin目录,在cmd窗口下执行如下命令使插件生效 如果后面发现在未失效请重启服务再查看
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
打开rabbitmq控制台,点击exchange,如果Add a new exchange功能里的Type下拉框里出现x-delayed-message类型,则说明安装成功,可以发布延时消息了
2、SpringBoot集成
2.1 在配置文件里创建配置支持延迟的交换机和队列
/**
* 支持延迟的交换机
* @return
*/
@Bean
public CustomExchange myExchangeYC() {
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "topic");
return new CustomExchange("YCExchange", "x-delayed-message", true, false,args);
}
//队列
@Bean
public Queue myTestQueueYC() {
return new Queue("YC", true); // 第二个参数设为true表示队列持久化
}
2.2 延迟消息生产者
/**
* 发送延迟mq消息
* @param message
*/
public void sendMessage5(String message) {
rabbitTemplate.convertAndSend("YCExchange","YC", message, new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
//设置消息持久化
message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
//设置消息的延迟时间为10000毫秒(即10秒)
message.getMessageProperties().setDelay(10000);
return message;
}
});
}
2.3 延迟消息消费者
/**
* 接收延迟消息
* @param message
*/
@RabbitListener(bindings = @QueueBinding( //同时绑定交换机和队列
exchange = @Exchange(value = "YCExchange",type = "x-delayed-message"),
key = "YC",
value = @Queue("YC")
))
public void receiveMessage2(String message) {
LocalDateTime now = LocalDateTime.now();
String formatted = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(formatted + "接收延迟消息: " + message);
}
2.4 编写控制层方法调用生产者测试,10秒后才消费到消息。