NodeJS amqp assertQueue博尔克一个连接的意思

oalqel3c  于 2023-10-17  发布在  Node.js
关注(0)|答案(2)|浏览(127)

在amqp的assertQueue API文档中,它指出:

  • 声明队列存在。此运算在给定相同参数的情况下是幂等的;但是,如果队列已经存在但具有不同的属性(arguments字段中提供的值可能会也可能不会计入borking目的;检查borker的,我的意思是经纪人的,文件)。*

http://www.squaremobius.net/amqp.node/channel_api.html#channel_assertQueue
我问的是什么意思,通过博尔克(ing)的渠道。我试过google,但找不到任何相关的东西。

snvhrwxg

snvhrwxg1#

博尔克:英语的意思是阻碍某事。
根据问题中的文档,它说
但是,如果队列已经存在但具有不同的属性,则它将博尔克通道
这意味着,如果你尝试创建一个与已经存在的通 prop 有相同属性的通道,则不会发生任何事情,因为它是idempotent(意味着重复相同的操作,没有不同的结果,例如,一个REST API GET请求获取id为123的数据,除非更新,否则每次都会返回相同的数据,一个解释无效概念的非常有趣的视频),但是如果你试图创建一个同名但属性不同的通道,通道创建将被“borked”,即。受阻。
在下面的代码中,我们再次创建通道,

var ok0 = ch.assertQueue(q, {durable: false});// creating the first time
 var ok1 = ch.assertQueue(q, {durable: true});// creating the second time again with different durable property value

抛出错误

“PRECONDITION_FAQUE-vhost”/“中队列”hello“的不等价参数”durable“:接收到“true”,但当前为“false”“
这意味着您正在尝试使用不同的属性创建相同的通道,即。耐久属性与现有通道不同,因此它已被删除。
[2]:@Like Bakken的回答

deyfvvtc

deyfvvtc2#

您是否尝试调用assertQueue两次,第二次使用不同的属性?你会很快回答你自己的问题。
我使用this code来创建这个测试程序:

#!/usr/bin/env node

var amqp = require('amqplib');

amqp.connect('amqp://localhost').then(function(conn) {
  return conn.createChannel().then(function(ch) {
    var q = 'hello';
    var ok0 = ch.assertQueue(q, {durable: false});
    return ok0.then(function(_qok) {
        var ok1 = ch.assertQueue(q, {durable: true});
        return ok1.then(function(got) {
            console.log(" [x] got '%s'", got);
            return ch.close();
        });
    });
  }).finally(function() { conn.close(); });
}).catch(console.warn);

然后,启动RabbitMQ并运行测试代码。您应该看到如下输出:

$ node examples/tutorials/assert-borked.js
events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: Channel closed by server: 406 (PRECONDITION-FAILED) with message "PRECONDITION_FAILED - inequivalent arg 'durable' for queue 'hello' in vhost '/': received 'true' but current is 'false'"
    at Channel.C.accept

相关问题