RabbitMQ学习(二)之 “消息队列基本使用”

安装RabbitMQ

后面会单独总结一篇安装RabbitMQ文章
由于 RabbitMQ 是用 Erlang 语言编写的,必须要先安装 Erlang。
安装成功以后,会提供默认的 VHost、Exchange。

Java API编程

引入依赖
创建 Maven 工程,pom.xml 引入依赖

<dependency>
	<groupId>com.rabbitmq</groupId>
	<artifactId>amqp-client</artifactId>
	<version>5.6.0</version>
</dependency>

生产者

public class MyProducer {
    
    
    private final static String EXCHANGE_NAME = "SIMPLE_EXCHANGE";public static void main(String[] args) throws Exception {
    
    
        ConnectionFactory factory = new ConnectionFactory();
        // 连接 IP
        factory.setHost("127.0.0.1");
        // 连接端口
        factory.setPort(5672);
        // 虚拟机
        factory.setVirtualHost("/");
        // 用户
        factory.setUsername("guest");
        factory.setPassword("guest");
        // 建立连接
        Connection conn = factory.newConnection();
        // 创建消息通道
        Channel channel = conn.createChannel();
        // 发送消息
        String msg = "Hello world, Rabbit MQ";
        // String exchange, String routingKey, BasicProperties props, byte[] body
        channel.basicPublish(EXCHANGE_NAME, "bread", null, msg.getBytes());
        channel.close();
        conn.close();
    }
}

消费者

public class MyConsumer {
    
    
    private final static String EXCHANGE_NAME = "SIMPLE_EXCHANGE";
    private final static String QUEUE_NAME = "SIMPLE_QUEUE";public static void main(String[] args) throws Exception {
    
    
        ConnectionFactory factory = new ConnectionFactory();
        // 连接 IP
        factory.setHost("127.0.0.1");
        // 默认监听端口
        factory.setPort(5672);
        // 虚拟机
        factory.setVirtualHost("/");
        // 设置访问的用户
        factory.setUsername("guest");
        factory.setPassword("guest");
        // 建立连接
        Connection conn = factory.newConnection();
        // 创建消息通道
        Channel channel = conn.createChannel();
        // 声明交换机
        // String exchange, String type, boolean durable, boolean autoDelete, Map<String, Object> arguments
        channel.exchangeDeclare(EXCHANGE_NAME, "direct", false, false, null);
        // 声明队列
        // String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" Waiting for message....");
        // 绑定队列和交换机
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "bread");
        // 创建消费者
        Consumer consumer = new DefaultConsumer(channel) {
    
    
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                                       byte[] body) throws IOException {
    
    
                String msg = new String(body, StandardCharsets.UTF_8);
                System.out.println("Received message : '" + msg + "'");
                System.out.println("consumerTag : " + consumerTag);
                System.out.println("deliveryTag : " + envelope.getDeliveryTag());
            }
        };
        // 开始获取消息
        // String queue, boolean autoAck, Consumer callback
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }
}

参数详解

  1. 声明交换机的参数
    String type:交换机的类型,direct, topic, fanout 中的一种。
    boolean durable:是否持久化,代表交换机在服务器重启后是否还存在。

  2. 声明队列的参数
    boolean durable:是否持久化,代表队列在服务器重启后是否还存在。
    boolean exclusive:是否排他性队列。排他性队列只能在声明它的 Connection中使用(可以在同一个 Connection 的不同的 channel 中使用),连接断开时自动删除。
    boolean autoDelete:是否自动删除。如果为 true,至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,队列会自动删除。

    Map<String, Object> arguments:队列的其他属性,例如:
    在这里插入图片描述

属性 含义
x-message-ttl 队列中消息的存活时间,单位毫秒
x-expires 队列在多久没有消费者访问以后会被删除
x-max-length 队列的最大消息数
x-max-length-bytes 队列的最大容量,单位 Byte
x-dead-letter-exchange 队列的死信交换机
x-dead-letter-routing-key 死信交换机的路由键
x-max-priority 队列中消息的最大优先级,消息的优先级不能超过它
  1. 消息属性 BasicProperties
    以下列举了一些主要的参数:
    在这里插入图片描述
参数 释义
Map<String,Object> headers 消息的其他自定义参数
Integer deliveryMode 2 持久化,其他:瞬态
Integer priority 消息的优先级
String correlationId 关联 ID,方便 RPC 相应与请求关联
String replyTo 回调队列
String expiration TTL,消息过期时间,单位毫秒

UI 管理界面的使用

RabbitMQ 可以通过命令(RabbitMQ CLI)、HTTP API 管理,也可以通过可视化的界面去管理,这个网页就是 managment 插件。

  1. 启用管理插件
    • Windows 启用管理插件
cd C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.6\sbin

rabbitmq-plugins.bat enable rabbitmq_management
- Linux 启用管理插件
cd /usr/lib/rabbitmq/bin

./rabbitmq-plugins enable rabbitmq_management
  1. 管理界面访问端口
    默认端口是 15672,默认用户 guest,密码 guest。guest 用户默认只能在本机访问,远程用户需要创建其他的用户。

  2. 虚拟机
    在 Admin 选项卡中:默认的虚拟机是 /,可以创建自定义的虚拟机。
    在这里插入图片描述

  3. Linux 创建 RabbitMQ 用户权限
    例如创建用户 admin,密码 admin,授权访问所有的 Vhost

firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd --reload
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

猜你喜欢

转载自blog.csdn.net/nonage_bread/article/details/111414414