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

本文围绕RabbitMQ展开,因它用Erlang编写,安装前需先装Erlang。介绍了Java API编程,包括引入依赖、生产者与消费者及参数详解。还提及RabbitMQ可通过命令、HTTP API或可视化界面管理,说明了启用管理插件、访问端口、虚拟机设置及Linux创建用户权限等内容。

安装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 deliveryMode2 持久化,其他:瞬态
Integer priority消息的优先级
String correlationId关联 ID,方便 RPC 相应与请求关联
String replyTo回调队列
String expirationTTL,消息过期时间,单位毫秒

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 ".*" ".*" ".*"
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值