首页 > 编程知识 正文

mqtt和rabbitmq的区别,rabbitmq支持多少队列

时间:2023-05-03 16:10:46 阅读:41322 作者:4568

queue.declareokqueuedeclare (字符串队列,布尔双精度,布尔表达式,布尔自动删除,映射,对象参数

durable持久化durable=true :持久化队列存储在磁盘上、固定并持久存储。 Rabbit服务重新启动时,其队列仍为RabbitMQ

中被调用。

durable=false :非持久性队列。 临时队列不保存在磁盘上。 Rabbit服务重新启动时队列将消失。

对exclusive单消费者队列常规队列中允许的消费者没有限制,如果多个消费者绑定到同一队列,RabbitMQ将使用轮询进行分发。 如果消费者需要独占队列,则在创建队列时

将属性exclusive设置为true。

exclusive :是否排他有两个作用。 一个是连接关闭时connection.close )此队列是否自动删除。 2 )该队列是否为专用私有。 如果不是排外的话,两个消费者都可以访问同一队列,没有任何问题。 如果是排外的,则锁定当前队列,其他连接无法访问。 同一连接的不同通道可以访问。 强制访问会报报告以下异常时:

通道错误; protocol method : # method channel.close (reply-code=405,reply-text=resource _ locked-cannotobtainexclusiveaclus '.itcouldbeoriginallydeclaredonanotherconnectionortheexclusivepropertyvaluedoesnotmatchthatoftheoriginaldeclaration .clasthed

自动删除自动删除=true :自动删除队列。 自动删除队列和普通队列在使用上没有区别。 唯一的区别是,当消费者断开连接时,队列将被删除。 自动删除队列允许的消费者没有限制

也就是说,在此队列的最后一个消费者断开连接时执行删除。 系统声明的随机队列。 默认情况下会自动删除。

你知道其他参数怎么有其他参数吗?

参数名称说明x-dead-letter-exchange目标开关x-dead-letter-routing-key目标消息的可选路由密钥x-expires队列是先进先出的原则是,如果超越了这个原则,后面的新闻就会取代前面的新闻。 x-max-length-bytes消息容量限制。 此参数限制队列容量,与x-max-length的目的相同,但受队列大小(字节)限制。 x-max-priority的最大优先级值为255的队列优先级功能x-overflow设置队列溢出行为。 这决定了消息在达到队列最大长度时会发生什么。 有效值为drop-head、reject-publish或reject-publish-dlx。 x-single-active-consumer指示队列是否为单个活动消费者。 如果为true,则注册的消费者组中只有一条消费者消费消息,其他消息将被忽略。 如果为false,则消息循环分发给所有消费者。 (默认假) x-queue-mode将队列设置为延迟模式,如果未设置为在磁盘上保留尽可能多的消息,则队列将保留内存缓存,然后单击, 如果消息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限制的是整个队列的大小,超过这个容量后无法存入消息。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。