一.linux环境安装rabbitMQ延时插件
*由于项目使用的rabbitmq3.8.3版本,所以下载3.8版本的延时插件,避免出现版本不一致导致的坑。
1.下载地址
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/tag/v3.8.0
2.选择ez文件
3.把插件放入rabbitMQ的plugins目录下
1)进入插件目录
cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.8/plugins
2)查看已安装的插件列表
rabbitmq-plugins list
4.执行安装命令
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
至此,安装成功。
5.重启rabbitMQ,使插件生效
service rabbitmq-server restart
或
systemctl stop rabbitmq-server
systemctl start rabbitmq-server
二.代码实现
1.定义消息队列的常量
public static final String ACT_DELAY_QUEUE= "act_delay_queue";//延迟消费队列
public static final String ACT_DELAY_EXCHANGE = "act_delay_exchange"; //延迟交换器
public static final String ACT_DELAY_ROUTING_KEY = "act_delay_routing_key";//延迟路由键
2.配置队列
/**
* 延迟队列
*/
@Bean
public Queue delayQueue() {
return new Queue(ACT_DELAY_QUEUE);
}
/**
* 声明延迟消费队列交换机-direct类型
* 注:把消息投递到那些binding key与routing key完全匹配的队列中。
* */
@Bean
public CustomExchange actDelayExchage(){
// 一共有三种构造方法,可以只传exchange的名字,
// 第二种,可以传exchange名字,是否支持持久化,是否可以自动删除,
//第三种在第二种参数上可以增加Map,Map中可以存放自定义exchange中的参数
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct");
//参数二为类型:必须是x-delayed-message
return new CustomExchange(ACT_DELAY_EXCHANGE, "x-delayed-message", true, false, args);
}
/**
* @description 绑定队列与交换机
* 把消费队列和立即消费交换机绑定, immediate_exchange, 路由键:immediate_routing_key
* @author songchengye
* @date 2020/10/24 13:24
*/
@Bean
public Binding binding() {
return BindingBuilder.bind(delayQueue()).to(actDelayExchage()).with(ACT_DELAY_ROUTING_KEY).noargs();
}
3.编写消息发送者
@Autowired
RabbitTemplate rabbitTemplate;
//测试延迟消息
public void sendOperationAct(String obj,String time){
SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
log.info("----------------------------进入测试延迟消息生产者 = " + obj);
System.out.println("准备发送:"+obj+"现在时间是:"+ format.format(new Date()));
rabbitTemplate.convertAndSend(MQConfig.ACT_DELAY_EXCHANGE, MQConfig.ACT_DELAY_ROUTING_KEY, obj,new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
//设置消息持久化
message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
message.getMessageProperties().setHeader("x-delay",time);
return message;
}
} );
}
4.编写消息消费者
@RabbitListener(queues = MQConfig.ACT_DELAY_QUEUE)
public void receive(String msg){
SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
System.out.println("接收到了第一个消息,现在时间是:"+ format.format(new Date()));
System.out.println(msg);
}
到此完成。
三.测试消息队列
@RequestMapping(value = "testDelay",method = RequestMethod.GET)
public void testDelay(){
mqActSender.sendOperationAct("测试延迟发送11111111","50000");
mqActSender.sendOperationAct("测试延迟发送22222222","10000");
}
测试结果: