一、下载安装插件
链接:延迟插件下载地址
二、安装插件
将你下载好的插件放到rabbitmq的安装目录plugins
下,
然后进入RabbitMQ安装目录的sbin
目录下,使用如下命令启用延迟插件;
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
注意:我这是第二次启动,之前已经启动过,所以返回结果稍有不同
三、延迟队列配置文件
@Configuration
public class DelayedQueueConfig {
public static final String DELAYED_EXCHANGE ="delayed_exchange";
public static final String DELAYED_QUEUE ="delayed_queue";
public static final String DELAYED_ROUTING_KET ="delayed.routing_key";
//声明交换机(基于延迟插件)
@Bean("delayedExchange")
public CustomExchange delayedExchange() {
Map<String, Object> arguments = new HashMap<>();
arguments.put("x-delayed-type", "direct");
return new CustomExchange(DELAYED_EXCHANGE, "x-delayed-message", true,
false, arguments);
}
//声明队列
@Bean("delayedQueue")
public Queue delayedQueue() {
//不能直接 new Queue(),会连接不上rabbitMq
return QueueBuilder.durable(DELAYED_QUEUE).build();
}
//绑定
@Bean
public Binding bindingDelayedExchangeAndQueue(@Qualifier("delayedQueue") Queue delayedQueue,
@Qualifier("delayedExchange") CustomExchange delayedExchange) {
return BindingBuilder.bind(delayedQueue).to(delayedExchange).with(DELAYED_ROUTING_KET).noargs();
}
}
注意:重点代码
Map<String, Object> arguments = new HashMap<>();
arguments.put("x-delayed-type", "direct");
四、消息生产者
@GetMapping("/sendMsgByDelayed")
//发送消息并设置过期时间 (基于延迟插件)
public void sendMsgByDelayed(@RequestParam("message") String message,
@RequestParam("time") Integer time) {
log.info("当前时间 {}, 时间为{},发送信息: {}",new Date().toString(),time, message);
rabbitTemplate.convertAndSend(DelayedQueueConfig.DELAYED_EXCHANGE,
DelayedQueueConfig.DELAYED_ROUTING_KET,
time+"毫秒延迟"+message, msg->{
//设置发送消息的延迟时长
msg.getMessageProperties().setDelay(time);
return msg;
});
}