• RabbitMQ实现延迟队列


    原文链接:https://blog.csdn.net/dh554112075/article/details/90597649

    使用RabbitMQ实现延迟队列的两种方式

    • TTL + DLX
    • 使用延迟插件

    Linux安装RabbitMQ

    首先创建用于连接RabbitMQ的Connection

    package com.dfyang.rabbitmq;
    
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    
    import java.io.IOException;
    
    public class RabbitConnectionFactory {
    
        private static final String IP_ADDRESS = "192.168.195.123";
        private static final int PORT = 5672;
        private static final String USERNAME = "root";
        private static final String PASSWORD = "151310";
    
        private static ConnectionFactory factory = new ConnectionFactory();
    
        static {
            factory.setHost(IP_ADDRESS);
            factory.setPort(PORT);
            factory.setUsername(USERNAME);
            factory.setPassword(PASSWORD);
        }
    
        public static Connection getConnection() {
            Connection connection = null;
            try {
                connection = factory.newConnection();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return connection;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    1.使用TTL + DLX创建延迟队列

    RabbitMQ死信队列
    在这里插入图片描述

    package com.dfyang.rabbitmq.dead;
    
    import com.dfyang.rabbitmq.RabbitConnectionFactory;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class TimeoutDLX {
        public static void main(String[] args) throws Exception {
            Connection connection = RabbitConnectionFactory.getConnection();
            Channel channel = connection.createChannel();
            //创建DLX及死信队列
            channel.exchangeDeclare("dlx.exchange", "direct");
            channel.queueDeclare("dlx.queue", true, false, false, null);
            channel.queueBind("dlx.queue", "dlx.exchange", "dlx.routingKey");
            //创建测试超时的Exchange及Queue
            channel.exchangeDeclare("delay.exchange", "direct");
            Map<String, Object> arguments = new HashMap<>();
            //过期时间10s
            arguments.put("x-message-ttl", 10000);
            //绑定DLX
            arguments.put("x-dead-letter-exchange", "dlx.exchange");
            //绑定发送到DLX的RoutingKey
            arguments.put("x-dead-letter-routing-key", "dlx.routingKey");
            channel.queueDeclare("delay.queue", true, false, false, arguments);
            channel.queueBind("delay.queue", "delay.exchange", "delay.routingKey");
            //发布一条消息
            channel.basicPublish("delay.exchange", "delay.routingKey", null, "该消息将在10s后发送到延迟队列".getBytes());
            channel.close();
            connection.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述
    10s后
    在这里插入图片描述

    2.使用延迟插件

    (1)下载延迟插件

    https://www.rabbitmq.com/community-plugins.html
    注意:支持RabbitMQ 3.5.8及更高版本
    在这里插入图片描述

    (2)将解压后的ez结尾的文件放到/rabbitmq/plugins/目录下
    (3)输入rabbitmq-plugins list查看延迟插件是否存在

    在这里插入图片描述

    (4)启用延迟插件

    启动插件:rabbitmq-plugins enable rabbitmq_delayed_message_exchange
    ——(关闭插件:rabbitmq-plugins disable rabbitmq_delayed_message_exchange)

    访问可视化界面,有如下则说明启动成功
    在这里插入图片描述

    (5)使用延时Exchange(消息发送到Exchange,Exchange等待指定时间后发送到匹配队列)

    注意x-delayed-type参数必须有,不然会报错。

    package com.dfyang.rabbitmq.dead;
    
    import com.dfyang.rabbitmq.RabbitConnectionFactory;
    import com.rabbitmq.client.AMQP;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class DelayExchangeDemo {
        public static void main(String[] args) throws Exception {
            Connection connection = RabbitConnectionFactory.getConnection();
            Channel channel = connection.createChannel();
            Map<String, Object> arguments = new HashMap<>();
            arguments.put("x-delayed-type", "direct");
            channel.exchangeDeclare("delay.plugin.exchange", "x-delayed-message", true, false, arguments);
            channel.queueDeclare("delay.plugin.queue", true, false, false, null);
            channel.queueBind("delay.plugin.queue", "delay.plugin.exchange", "delay.plugin.routingKey");
            Map<String, Object> headers = new HashMap<>();
            //延迟10s后发送
            headers.put("x-delay", 10000); 
            AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
            builder.headers(headers);
            channel.basicPublish("delay.plugin.exchange", "delay.plugin.routingKey", builder.build(), "该消息将在10s后发送到队列".getBytes());
            channel.close();
            connection.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这里插入图片描述
    10s后
    在这里插入图片描述

  • 相关阅读:
    从零开始搭建VUE项目
    推送类型
    spring整合消息队列rabbitmq
    Terracotta
    MYSQL INNODB 存储引擎
    Java 各种读取文件方法以及文件合并
    spring-security用户权限认证框架
    Spring Bean初始化过程
    使用PLSQL客户端登录ORACLE时报ORA-12502和ORA-12545错误的解决方案
    计算机语言基础概况
  • 原文地址:https://www.cnblogs.com/fswhq/p/13859585.html
Copyright © 2020-2023  润新知