安装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);
}
}
参数详解
-
声明交换机的参数
String type:交换机的类型,direct, topic, fanout 中的一种。
boolean durable:是否持久化,代表交换机在服务器重启后是否还存在。 -
声明队列的参数
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 | 队列中消息的最大优先级,消息的优先级不能超过它 |
- 消息属性 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 插件。
- 启用管理插件
- 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
-
管理界面访问端口
默认端口是 15672,默认用户 guest,密码 guest。guest 用户默认只能在本机访问,远程用户需要创建其他的用户。 -
虚拟机
在 Admin 选项卡中:默认的虚拟机是 /,可以创建自定义的虚拟机。
-
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 ".*" ".*" ".*"