【问题标题】:How can I determine what sort of socket I should use to get messages from a RabbitMQ queue?如何确定应该使用哪种套接字从 RabbitMQ 队列中获取消息?
【发布时间】:2015-07-02 16:18:34
【问题描述】:

我正在使用 Rabbit.js 连接到远程服务器上的队列。问题是每次我尝试连接时都会得到:

Error: Channel closed by server: 406 (PRECONDITION-FAILED) with message 
  "PRECONDITION_FAILED - inequivalent arg 'durable' for exchange 'WorkOrderQuery.Response' in vhost '/': received 'false' but current is 'true'"
  at Channel.C.accept (/Users/collumj/work/alpha/node_modules/rabbit.js/node_modules/amqplib/lib/channel.js:398:24)
  at Connection.mainAccept [as accept] (/Users/collumj/work/alpha/node_modules/rabbit.js/node_modules/amqplib/lib/connection.js:63:33)

如果需要,我可以提供代码。我尝试在相关点传递带有durable: true 的选项对象无效。一切都以正确的顺序启动,但我总是收到关于持久值设置错误的错误。

问题是:我如何查看 RabbitMQ 服务器上的队列页面并确定我应该使用哪种类型的套接字来连接它?我可以尝试一些但盲目尝试是不行的这不是一个好方法,所以我宁愿知道我使用的是正确的类型。

这两件事可能彼此无关。如果是这样,我将不胜感激,因为我显然错过了它。

这是我的 RabbitMQ 队列页面的图片:

编辑:将我的 SUBSCRIBE 套接字更改为 PULL 套接字修复了它。仍然不确定通过查看队列页面我会如何知道(或是否)。

【问题讨论】:

    标签: javascript node.js sockets rabbitmq rabbit.js


    【解决方案1】:

    我不知道您的库使用的抽象背后是什么,但错误消息:

    “PRECONDITION_FAILED - 不等价的 arg 'durable' 用于在 vhost '/' 中交换 'WorkOrderQuery.Response':收到 'false' 但当前为 'true'”

    意味着您的程序在某些时候将交换声明为持久的,但随后又尝试将其重新声明为非持久的。

    在 RabbitMQ 中,无论何时重新声明交换或队列,都必须使用与创建资源时相同的参数

    【讨论】:

    • 我是这么想的,但我没有宣布交换。我只是想连接到一个队列,所以真的很混乱。
    • 没有看到一些代码很难评估发生了什么。同样,库可能在其 API 上“连接到队列”,但在幕后它可能正在声明交换。
    猜你喜欢
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多