全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-22 8 分钟 ✍️ juanwangdev

队列 Queue

队列是RabbitMQ中存储消息的数据结构,遵循先进先出(FIFO)原则,消费者从队列中按顺序获取消息。

基本概念

队列是消息的容器,具有以下特征:

  • 消息按到达顺序存储在队列尾部
  • 消费者从队列头部获取消息
  • 多个消费者订阅同一队列时,消息以轮询方式分发
XML
Exchange ──> [Queue: msg1, msg2, msg3] ──> Consumer

Java Client 示例

Maven依赖:

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

声明队列:

Java
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;

public class QueueExample {
    private static final String QUEUE_NAME = "order_queue";

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            // 声明队列:名称、是否持久化、是否独占、是否自动删除、额外参数
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);

            System.out.println("队列声明完成");
        }
    }
}

发送消息到队列:

Java
String message = "订单创建成功";

// 使用空交换机和队列名称路由
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println("消息已发送: " + message);

消费队列消息:

text
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
    String receivedMessage = new String(delivery.getBody(), "UTF-8");
    System.out.println("收到消息: " + receivedMessage);

    // 手动确认消息
    channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};

// 启动消费者,autoAck=false表示手动确认
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> { });

队列参数说明

queueDeclare() 方法的参数含义:

参数类型说明
queueString队列名称
durableboolean是否持久化,重启后队列是否保留
exclusiveboolean是否独占,仅允许声明它的连接访问
autoDeleteboolean最后一个消费者断开后是否自动删除
argumentsMap额外参数,如TTL、死队列配置等

使用 queueDeclare() 时,若队列已存在且参数不一致,会抛出 Channel shutdown 异常。

注意事项

  1. 默认交换机为 ""(空字符串),类型为Direct,所有队列自动绑定到默认交换机
  2. 消息确认机制很重要,不确认的消息会在消费者断开后重新入队
  3. 队列名称全局唯一,不同VHost下可存在同名队列
  4. 独占队列在连接断开时自动删除,适用于临时任务场景

要点总结

  • 队列是FIFO消息存储结构,消费者按顺序从队列获取消息
  • 通过 channel.queueDeclare() 声明队列,需配置持久化、独占、自动删除等属性
  • 多消费者订阅同一队列时,消息以轮询方式分发给各消费者
  • 消息必须手动确认(basicAck),否则会在消费者断开后重新入队

文章存放路径:D:\git2\jwdev\articles\RABBITMQ\入门\核心概念入门\队列 Queue.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 连接 Connection 与通道 Channel
下一篇 → 消息属性与编码
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库