文章目录
- [一. 引入依赖](#一. 引入依赖)
- [二. 编写生产者代码](#二. 编写生产者代码)
-
-
- [1. 创建连接](#1. 创建连接)
- [2. 创建channel](#2. 创建channel)
- [3. 声明一个队列](#3. 声明一个队列)
- [4. 发送消息](#4. 发送消息)
- [5. 释放资源](#5. 释放资源)
- [6. 运行代码](#6. 运行代码)
-
- [三. 编写消费者代码](#三. 编写消费者代码)
-
-
- [1. 创建连接](#1. 创建连接)
- [2. 创建channel](#2. 创建channel)
- [3. 声明队列](#3. 声明队列)
- [4. 消费消息](#4. 消费消息)
- [5. 释放资源](#5. 释放资源)
- [6. 运行代码](#6. 运行代码)
-
一. 引入依赖
xml
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.20.0</version>
</dependency>
二. 编写生产者代码
RabbitMQ 默认的⽤于客⼾端连接的TCP 端⼝号是5672, 需要提前进⾏开放
1. 创建连接
java
public static void main(String[] args) throws IOException, TimeoutException {
//1. 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//2. 设置参数
factory.setHost("139.9.84.204");//ip
factory.setPort(5672);//端口号
factory.setVirtualHost("study");//虚拟机名称
factory.setUsername("admin");//用户名
factory.setPassword("admin");//密码
//3. 创建连接connection
Connection connection = factory.newConnection();
}
2. 创建channel
java
//创建channel
Channel channel = connection.createChannel();
3. 声明一个队列
java
//声明队列
//如果没有一个hello这样的队列, 会自动创建, 如果有, 则不创建
channel.queueDeclare("hello", true, false, false, null);
参数说明:
- queue: 队列名称
- durable: 是否持久化, 设置为true, 待持久化的队列会存盘, 服务器重启之后, 消息不会丢失
- exclusive:
是否独占, 只能有一个消费者监听队列
当Connection关闭时, 是否删除队列 - autoDelete: 是否自动删除, 当没有Consumer时, 自动删除
- arguments: 参数
4. 发送消息
每个虚拟机会有几个内置的交换机, 内置交换机的名称是空字符串("")
我们现在要编写的事简单的应用场景, 使用内置交换机即可, 此时, 生产者发送的消息会根据队列名直接路由到对应的队列, 无需关心交换机
java
//发送消息
String msg = "Hello RabbitMQ";
channel.basicPublish("", "hello", null, msg.getBytes(StandardCharsets.UTF_8));
参数说明:
- exchange: 交换机名称
- routingKey: 路由名称, 当使用内置交换机时, routingKey = 队列名称
- props: 配置信息
- body: 发送消息的数据
5. 释放资源
java
//释放资源
channel.close();
connection.close();
6. 运行代码
队列添加成功
点进去就可以看到消息
如果没有进行资源释放, 就会看到连接信息和channel信息
三. 编写消费者代码
1. 创建连接
java
public static void main(String[] args) throws IOException, TimeoutException {
//1. 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//2. 设置参数
factory.setHost("139.9.84.204");//ip
factory.setPort(5672);//端口号
factory.setVirtualHost("study");//虚拟机名称
factory.setUsername("admin");//用户名
factory.setPassword("admin");//密码
//3. 创建连接connection
Connection connection = factory.newConnection();
}
2. 创建channel
java
//创建channel
Channel channel = connection.createChannel();
3. 声明队列
如果生产者已经声明了队列, 这步可以省略
java
//声明队列
//如果没有一个hello这样的队列, 会自动创建, 如果有, 则不创建
channel.queueDeclare("hello", true, false, false, null);
4. 消费消息
java
//消费消息
DefaultConsumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("获取到队列: " + new String(body));
}
};
channel.basicConsume("hello", true, consumer);
basicConsume参数声明:
- queue: 队列名称
- autoAck: 是否自动确认, 消费者收到消息之后,自动和MQ确认
- callback: Consumer类型, 表示接收到消息后, 需要执行的逻辑
Consumer介绍:
Consumer 用于定义消息消费者的行为. 当我们需要从RabbitMQ接收消息时, 需要提供⼀个实现了Consumer 接口的对象.
DefaultConsumer 是 RabbitMQ提供的⼀个默认消费者, 实现了Consumer 接口
核心方法:
从队列接收到消息时, 会⾃动调⽤该⽅法.
在这个方法中, 我们可以定义如何处理接收到的消息, 例如打印消息内容, 处理业务逻辑或者将消息
存储到数据库等
5. 释放资源
java
//释放资源
channel.close();
connection.close();
6. 运行代码
此时就消费了hello队列中的消息
目前只能看到打印一条数据, 因为还没等打印成功, 资源就被释放了
可以加入等待, 让等全部打印成功后再进行资源释放
生产10条数据:
执行: