RabbitMQ延迟队列

可以用死信队列实现延迟队列,这里不展开,只讲一下利用插件的方式

在 RabbitMQ 的  3.5.7  版本之后,提供了一个插件( rabbitmq-delayed-message-exchange )来实现延迟队列 ,同时需保证  Erlang/OPT  版本为  18.0  之后。

安装延迟队列插件

1. RabbitMQ版本在  3.5.7-3.7.x  的可以执行以下命令进行下载(也可以直接通过浏览器下载):

wget https://bintray.com/rabbitmq/community-plugins/download_file?file_path=rabbitmq_delayed_message_exchange-0.0.1.ez

如果 RabbitMQ 是  3.8  之后的版本,可以点击这里,找到延迟队列对应版本的插件,然后下载。

2. 下载好之后,将插件上传到 plugins 目录下,执行  rabbitmq-plugins enable rabbitmq_delayed_message_exchange  命令启动插件。如果要禁止该插件,则可以执行命令  rabbitmq-plugins disable rabbitmq_delayed_message_exchange (启用插件后需要重启 RabbitMQ 才会生效)。

PS:如果是docker容器可以下面的命令把文件复制进容器内

docker cp rabbitmq_delayed_message_exchange-3.10.2.ez bccff492754f:/plugins

延迟队列插件示例

1. 新建一个 PluginDelayRabbitConfig  配置类:

@Configuration
public class PluginDelayRabbitConfig {
    @Bean("pluginDelayExchange")
    public CustomExchange pluginDelayExchange() {
        Map<String, Object> argMap = new HashMap<>();
        argMap.put("x-delayed-type", "direct");//必须要配置这个类型,可以是direct,topic和fanout
        //第二个参数必须为x-delayed-message
        return new CustomExchange("PLUGIN_DELAY_EXCHANGE","x-delayed-message",false, false, argMap);
    }

    @Bean("pluginDelayQueue")
    public Queue pluginDelayQueue(){
        return new Queue("PLUGIN_DELAY_QUEUE");
    }

    @Bean
    public Binding pluginDelayBinding(@Qualifier("pluginDelayQueue") Queue queue,@Qualifier("pluginDelayExchange") CustomExchange customExchange){
        return BindingBuilder.bind(queue).to(customExchange).with("delay").noargs();
    }
}

2. 新建一个消费者类 PluginDelayConsumer :

@Component
public class PluginDelayConsumer {

    @RabbitHandler
    @RabbitListener(queues = "PLUGIN_DELAY_QUEUE")//监听延时队列
    public void fanoutConsumer(String msg){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("【插件延迟队列】【" + sdf.format(new Date()) + "】收到消息:" + msg);
    }
}

3. 新建 DelayQueueController  类,新增一个方法:

@GetMapping(value="/plugin/send")
public String pluginMsgSend(@RequestParam(value = "msg",defaultValue = "no message") String msg){
    MessageProperties messageProperties = new MessageProperties();
    messageProperties.setHeader("x-delay",5000);//延迟5秒被删除
    Message message = new Message(msg.getBytes(), messageProperties);
    amqpTemplate.convertAndSend("PLUGIN_DELAY_EXCHANGE","delay",message);//交换机和路由键必须和配置文件类中保持一致
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println("消息发送成功【" + sdf.format(new Date()) + "】");
    return "succ";
}

4. 接下来就可以访问地址  http://localhost:8080/delay/plugin/send?msg=插件延迟队列消息  进行测试,可以看到,消息在延时 5 秒之后被消费

 原文链接:https://www.cnblogs.com/lonely-wolf/p/14368920.html

posted @ 2022-05-18 16:58  yanglei.xyz  阅读(296)  评论(0)    收藏  举报