Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
Map<String, Object> arguments) throws IOException;
queue
queue参数用来指定创建的队列的名字。
durable持久化
exclusive单消费者队列
普通队列允许的消费者没有限制,多个消费者绑定到同一个队列时,RabbitMQ会采用轮询进行投递。如果需要消费者独占队列,在队列创建的时候, 设定属性exclusive为true。
exclusive:是否排外的,有两个作用,一:当连接关闭时connection.close()该队列是否会自动删除;二:该队列是否是私有的private,如果不是排外的,可以使用两个消费者都访问同一个队列,没有任何问题,如果是排外的,会对当前队列加锁,其他连接connection是不能访问的,同一个连接的不同channel是可以访问的。如果强制访问会报如下异常:
channel error; protocol method:
一般等于true的话用于一个队列只能有一个消费者来消费的场景
autoDelete自动删除
自动删除队列和普通队列在使用上没有什么区别,唯一的区别是,当消费者断开连接时,队列将会被删除。自动删除队列允许的消费者没有限制, 也就是说当这个队列上最后一个消费者断开连接才会执行删除。系统声明的随机队列,缺省就是自动删除的。
其他参数
怎么知道有哪些其他参数?

参数名 | 说明 |
---|
x-dead-letter-exchange | 死信交换器 | x-dead-letter-routing-key | 死信消息的可选路由键 | x-expires | 队列在指定毫秒数后被删除 | x-message-ttl | 毫秒为单位的消息过期时间,队列级别 | x-ha-policy | 创建HA队列,此参数已失效 | x-ha-nodes | HA队列的分布节点,此参数已失效 | x-max-length | 队列的消息条数限制。限制加入queue中消息的条数。先进先出原则,超过后,后面的消息会顶替前面的消息。 | x-max-length-bytes | 消息容量限制,该参数和x-max-length目的一样限制队列的容量,但是这个是靠队列大小(bytes)来达到限制。 | x-max-priority | 最大优先值为255的队列优先排序功能 | x-overflow | 设置队列溢出行为。这决定了当达到队列的最大长度时消息会发生什么。有效值是drop-head、reject-publish或reject-publish-dlx。 | x-single-active-consumer | 表示队列是否是单一活动消费者,true时,注册的消费组内只有一个消费者消费消息,其他被忽略,false时消息循环分发给所有消费者(默认false) | x-queue-mode | 将队列设置为延迟模式,在磁盘上保留尽可能多的消息,以减少RAM的使用;如果未设置,队列将保留内存缓存以尽可能快地传递消息 | x-queue-master-locator | 在集群模式下设置镜像队列的主节点信息 |
死信交换器
如果使用消息拒绝机制,同时requeue参数设置为false时,消息丢失了,这点作为程序员我们不能忍。所以RabbitMQ作为一个高 级消息中间件,提出了死信交换器的概念,死信,意思就是死了的信息。这种交换器专门处理死了的信息(被拒绝可以重新投递的信息不能算死的)。
死信交换器是RabbitMQ对AMQP规范的一个扩展,往往用在对问题消息的诊断上(主要针对消费者),还有延时队列的功能。
消息变成死信一般是以下三种情况:
死信交换器仍然只是一个普通的交换器,创建时并没有特别要求和操作。在创建队列的时候,声明该交换器将用作保存被拒绝的消息即可,相关的
代码如下。
channel.exchangeDeclare(DEAD_LETTER_EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
Map<String, Object> arguments = new HashMap<>();
arguments.put("x-dead-letter-exchange", DEAD_LETTER_EXCHANGE_NAME);
arguments.put("x-dead-letter-routing-key", "666");
channel.queueDeclare(QUEUE_NAME, false, false, false, arguments);
channel.queueDeclare(DEAD_LETTER_QUEUE_NAME, false, false, false, null);
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "xxx");
channel.queueBind(DEAD_LETTER_QUEUE_NAME, DEAD_LETTER_EXCHANGE_NAME, "");
channel.basicConsume(QUEUE_NAME, false, 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.basicReject(envelope.getDeliveryTag(), false);
}
});
自动过期队列
指队列在超过一定时间没使用,会被从RabbitMQ中被删除。
什么是没使用?1、一定时间内没有Get 操作发生。2、没有Consumer 连接在队列上。
特别的:就算一直有消息进入队列,也不算队列在被使用。 通过声明队列时,设定x-expires参数即可,单位毫秒。 比如这个队列会在当消费者断开连接时10秒后过期。
队列级别消息过期
就是为每个队列设置消息的超时时间。只要给队列设置x-message-ttl参数,就设定了该队列所有消息的存活时间,时间单位是毫秒。如果声明队列 时指定了死信交换器,则过期消息会成为死信消息。
队列的限制
x-max-length限制的是队列中消息的条数,如果消息的条数超过最大值,那么最先进入队列的数据就会被丢弃,也可以通过此x-overflow参数指定数据的处理方式
x-max-length-bytes限制的是整个队列的大小,超过这个容量后无法存入消息。
|