IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> RabbitMQ中队列的参数 -> 正文阅读

[大数据]RabbitMQ中队列的参数

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

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:48:25  更:2021-07-30 12:49:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 3:34:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码