在下图中,“P” 是我们的生产者,“C” 是我们的消费者。中间的框是一个队列-RabbitMQ 代表使用者保留的消息缓冲区。
1、创建项目
IDEA 创建空项目(empty project): RabbitMQ
。创建 maven 子模块:rabbitmq-hello
导入依赖
<!-- rabbitmq 客户端依赖 -->
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.15.0</version>
</dependency>
<!-- 操作文件流的依赖 -->
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
2、编写代码
Web管理界面端口是:
15672
RabbitMQ的端口是:
5672
# 防火墙开启 5672 端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --add-port=5672/tcp
firewall-cmd --reload
# 查看开启了哪些端口
firewall-cmd --list-ports
1)生产者代码
/**
* @desc 生产者
* @auth llp
* @date 2022年07月27日 22:15
*/
public class Producer {
/** 队列名称 */
private static final String QUEUE_NAME = "hello";
// 发消息
public static void main(String[] args) throws IOException, TimeoutException {
// 创建一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置连接 RabbitMQ 的 IP
factory.setHost("192.168.40.25");
// 端口默认 factory.setPort(5672);
// 用户名
factory.setUsername("mianbao");
// 密码
factory.setPassword("admin");
// 创建连接
Connection connection = factory.newConnection();
// 根据工作原理图 下一步获取信道
Channel channel = connection.createChannel();
// 使用默认的交换机
/**
* 生成一个队列 参数:
* 1、队列名称
* 2、队列里面的消息是否持久化(磁盘)默认情况消息存储在内存中
* 3、该队列是否只供一个消费者进行消费是否进行消息共享。true:只能一个消费者消费 false:消费可以多个消费者消费
* 4、是否自动删除。最后一个消费者断开连接以后,该队列是否自动删除 true:自动删除 false:不自动删除
* 5、队列的其他属性(构造参数)
*/
channel.queueDeclare(QUEUE_NAME, false, false, false,null);
// 发消息
String message = "Hello RabbitMQ";
/**
* 发送一个消息 参数:
* 1、发送到哪个交换机
* 2、路由 Key 是哪个 (本次是队列名称)
* 3、其他参数
* 4、发送消息的消息体
*/
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println("========== 消息发送完毕 ============");
}
}
运行生产者代码后,查看 RabbitMQ web 管理界面:
2)消费者代码
/**
* @desc 消费者 接收消息
* @auth llp
* @date 2022年07月27日 22:44
*/
public class Consumer {
/** 队列名称 */
private static final String QUEUE_NAME = "hello";
// 接收消息
public static void main(String[] args) throws IOException, TimeoutException {
// 创建一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.40.25");
// 端口默认 factory.setPort(5672);
factory.setUsername("mianbao");
factory.setPassword("admin");
// 创建连接
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
/**
* 消费者 消费消息
* 1、队列的名称
* 2、消费成功之后是否要自动应答。 true:代表的自动应答 false:代表手动应答
* 3、消息传递时的回调
* 4、消费者取消时的回调
*/
// 消费成功的回调
DeliverCallback deliverCallback = (consumerTag, message)-> System.out.println(new String(message.getBody()));
// 消息消费失败的回调
CancelCallback cancelCallback = consumerTag -> System.out.println("消息消费中断...");
channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
}
}
运行测试