代码之家  ›  专栏  ›  技术社区  ›  WillW

amqp assertQueue bork a连接含义

  •  4
  • WillW  · 技术社区  · 7 年前

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

    http://www.squaremobius.net/amqp.node/channel_api.html#channel_assertQueue

    我在问博克频道是什么意思。我试过谷歌,但找不到任何相关信息。

    2 回复  |  直到 7 年前
        1
  •  6
  •   Yash Tibrewal    2 年前

    博克:英语的意思是阻碍某事。

    根据问题中的文件,它说

    然而,如果队列已经存在,但已经存在,它将阻塞通道

    这意味着,如果您尝试创建一个与已退出的通道具有相同属性的通道,则不会发生任何事情,因为它是 idempotent (这意味着重复相同的操作而没有不同的结果,例如,一个REST API GET请求获取id(比如123)的数据,除非更新,否则每次都会返回相同的数据,这是一个非常有趣的视频,解释了这个无能的概念),但如果你试图创建一个名称相同但属性不同的频道,那么频道创建将被“阻塞”,即受阻。

    在下面的代码中,我们再次创建通道,

     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\u失败-中队列“hello”的参数“durable”不等价 vhost“/”:收到“true”,但当前为“false”

    这意味着您正试图使同一个通道具有不同的属性,即持久属性不同于现有通道,因此它已损坏。

    [2] :由@Like Bakken回答

        2
  •  1
  •   Luke Bakken    7 年前

    RabbitMQ团队监控 this mailing list 有时只回答有关StackOverflow的问题。

    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