RabbitMQ中队列的参数

7 篇文章 0 订阅
Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
                             Map<String, Object> arguments) throws IOException;

queue

queue参数用来指定创建的队列的名字。

durable持久化

  • durable=true:持久化队列,会被保存在磁盘中,固定并持久的存储,当Rabbit服务重启后,该队列会保持原来的状态在RabbitMQ
    中被管理。

  • durable=false:非持久化队列,临时队列,不会被保存在磁盘中,Rabbit服务重启后队列就会消失。

exclusive单消费者队列

普通队列允许的消费者没有限制,多个消费者绑定到同一个队列时,RabbitMQ会采用轮询进行投递。如果需要消费者独占队列,在队列创建的时候,
设定属性exclusive为true。

exclusive:是否排外的,有两个作用,一:当连接关闭时connection.close()该队列是否会自动删除;二:该队列是否是私有的private,如果不是排外的,可以使用两个消费者都访问同一个队列,没有任何问题,如果是排外的,会对当前队列加锁,其他连接connection是不能访问的,同一个连接的不同channel是可以访问的。如果强制访问会报如下异常:

channel error; protocol method: #method<channel.close>(reply-code=405, reply-text=RESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'ExclusiveQueue' in vhost '/'. It could be originally declared on another connection or the exclusive property value does not match that of the original declaration., class-id=50, method-id=10)

一般等于true的话用于一个队列只能有一个消费者来消费的场景

autoDelete自动删除

  • autoDelete=true:自动删除队列。

自动删除队列和普通队列在使用上没有什么区别,唯一的区别是,当消费者断开连接时,队列将会被删除。自动删除队列允许的消费者没有限制,
也就是说当这个队列上最后一个消费者断开连接才会执行删除。系统声明的随机队列,缺省就是自动删除的。

其他参数

怎么知道有哪些其他参数?

在这里插入图片描述

参数名说明
x-dead-letter-exchange死信交换器
x-dead-letter-routing-key死信消息的可选路由键
x-expires队列在指定毫秒数后被删除
x-message-ttl毫秒为单位的消息过期时间,队列级别
x-ha-policy创建HA队列,此参数已失效
x-ha-nodesHA队列的分布节点,此参数已失效
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规范的一个扩展,往往用在对问题消息的诊断上(主要针对消费者),还有延时队列的功能。

消息变成死信一般是以下三种情况:

  • 消息被拒绝,并且设置requeue 参数为false

  • 消息过期(默认情况下Rabbit 中的消息不过期,但是可以设置队列的过期时间和消息的过期时间以达到消息过期的效果)

  • 队列达到最大长度(>x-max-length)

死信交换器仍然只是一个普通的交换器,创建时并没有特别要求和操作。在创建队列的时候,声明该交换器将用作保存被拒绝的消息即可,相关的

代码如下。

// 死信交换器
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限制的是整个队列的大小,超过这个容量后无法存入消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

morris131

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值