队列 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() 方法的参数含义:
| 参数 | 类型 | 说明 |
|---|---|---|
| queue | String | 队列名称 |
| durable | boolean | 是否持久化,重启后队列是否保留 |
| exclusive | boolean | 是否独占,仅允许声明它的连接访问 |
| autoDelete | boolean | 最后一个消费者断开后是否自动删除 |
| arguments | Map | 额外参数,如TTL、死队列配置等 |
使用
queueDeclare()时,若队列已存在且参数不一致,会抛出Channel shutdown异常。
注意事项
- 默认交换机为
""(空字符串),类型为Direct,所有队列自动绑定到默认交换机- 消息确认机制很重要,不确认的消息会在消费者断开后重新入队
- 队列名称全局唯一,不同VHost下可存在同名队列
- 独占队列在连接断开时自动删除,适用于临时任务场景
要点总结
- 队列是FIFO消息存储结构,消费者按顺序从队列获取消息
- 通过
channel.queueDeclare()声明队列,需配置持久化、独占、自动删除等属性 - 多消费者订阅同一队列时,消息以轮询方式分发给各消费者
- 消息必须手动确认(basicAck),否则会在消费者断开后重新入队
文章存放路径:D:\git2\jwdev\articles\RABBITMQ\入门\核心概念入门\队列 Queue.md
📝 发现内容有误?点击此处直接编辑