springBoot+RabbitMq 实现延时发送消息-插件方式

一.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");
}

测试结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43945983/article/details/109316430