1. 介绍

RabbitMQ 是一个消息代理,提供组件间的异步通信能力。它实现了 AMQP(高级消息队列协议),这是目前最主流的消息协议。

本教程将演示如何使用 Java 客户端库在 RabbitMQ 中动态创建队列。

2. RabbitMQ 消息模型

开始前先快速回顾 RabbitMQ 的工作原理:

需要先理解 AMQP 的核心组件(即 AMQP 实体)。交换器、队列和绑定 统称为 AMQP 实体。

在 RabbitMQ 中,生产者从不直接向队列发送消息,而是通过交换器作为路由中介。消息发布流程如下:

  1. 生产者将消息发送到交换器
  2. 交换器根据绑定规则将消息路由到队列
  3. 消费者从队列获取消息(推送或拉取模式)
  4. 消息传递遵循 FIFO(先进先出)模型

3. 连接初始化

RabbitMQ 提供所有主流语言的客户端库。Java 标准方案是使用官方的 amqp-client 库。先添加 Maven 依赖

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

客户端交互的第一步是建立Connection。连接建立后,从中创建ChannelAMQP 通道本质是共享单个 TCP 连接的轻量级连接,通过通道可以在单个 TCP 连接上复用多个逻辑连接。

Java 客户端使用工厂模式创建连接:

  1. 创建 ConnectionFactory 实例并配置参数(至少需要主机地址):

    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("amqp.baeldung.com");
    
  2. 通过工厂方法获取 Connection

    Connection connection = factory.newConnection();
    
  3. 从连接创建通道:

    Channel channel = connection.createChannel();
    

现在可以通过 Channel 向 RabbitMQ 发送命令了。⚠️ 注意:可以配置单/多连接的通道策略优化性能。

4. 创建动态队列

Java 客户端提供了便捷的队列管理方法,重点看以下两个:

4.1. 创建队列

使用 ChannelqueueDeclare() 方法动态创建队列。如果队列不存在则创建,存在则直接返回。方法签名:

queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)

参数说明:

  • queue:队列名称
  • durable:是否持久化(服务器重启后队列是否保留)
  • exclusive:是否排他(仅限当前连接使用)
  • autoDelete:是否自动删除(不再使用时由服务器删除)
  • arguments:队列额外属性

示例代码:

AMQP.Queue.DeclareOk declareOk = channel.queueDeclare("baeldung-queue", true, false, false, null);

✅ 成功时返回 AMQP.Queue.DeclareOk,失败抛 IOException。可通过返回对象获取队列信息:

String queueName = declareOk.getQueue();      // 队列名
int messageCount = declareOk.getMessageCount(); // 消息数
int consumerCount = declareOk.getConsumerCount(); // 消费者数

4.2. 检查队列存在性

使用 queueDeclarePassive() 方法检查队列是否存在

AMQP.Queue.DeclareOk declareOk = channel.queueDeclarePassive("baeldung-queue");
  • ✅ 队列存在时返回 DeclareOk
  • ❌ 队列不存在/排他/其他错误时抛 IOException

操作完成后记得关闭资源:

channel.close();
connection.close();

💡 建议使用 try-with-resources 自动管理资源。

5. 结论

本文介绍了:

  1. RabbitMQ 连接和通道的建立流程
  2. 使用 Java 客户端动态创建队列的方法
  3. 队列存在性检查的实践技巧

完整示例代码见 GitHub 仓库


原始标题:Create Dynamic Queues in RabbitMQ