要么“当-js”或基本的amqplib rabbitmq nodejs教程不工作

我有最新版本的nodejs(0.10.21,amqplib(0.1.0)( https://github.com/squaremo/amqp.node.git )和rabbitmq(3.2.0))。

  1. 启动rabbitmq-server
  2. 在安装npm包之后,转到amqp.node / examples / tutorials并运行./send.js。

它报告: [x] Sent 'Hello World!'

从rabbitmq的Web控制台,我可以看到它创build的连接,它创build队列“你好”。 但是,它实际上不会将任何消息发布到队列中。

除了RPC客户端/服务器外,其他教程都不适用于我 – 它们将创build交换,队列和通道,但不会发布消息。

我的一个朋友使用所有相同的版本运行正常,除了OS X 10.6,而不是10.8。

我使用节点检查器遍历了amqplib代码,看不到任何明显的错误。 它看起来好像没有创build消息框架,但在那个层面上,我现在还没有真正的想法。

当我通过Web控制台或使用Bunny + Ruby发布消息时,它会创build一个队列并按预期发布消息,所以它必须是node,amqp和/或OS X 10.8而不是rabbitmq的问题。

rabbitmq日志(拖尾两个日志)只提到连接打开,然后很快closures,但不报告任何错误:

=INFO REPORT==== 27-Oct-2013::20:46:16 === accepting AMQP connection <0.731.0> (127.0.0.1:56927 -> 127.0.0.1:5672)

=INFO REPORT==== 27-Oct-2013::20:46:16 === closing AMQP connection <0.731.0> (127.0.0.1:56927 -> 127.0.0.1:5672)

我嗅探了从amqp节点发送到rabbitmq的数据包。 这来自运行示例/教程中第一个示例“send.js”的amqp.node:

http://www.limorph.com/files/amqp_amqnode_send.txt

您可以看到它如何打开连接,创build队列并closures连接,但不发送消息。

这个来自ruby / bunny – 你可以看到它是如何打开连接,创build队列,并发布消息。

http://www.limorph.com/files/amqp_bunny.txt

我发现,如果我删除conn.close(),它设法发布消息。

例如

 })).ensure(function() { // conn.close(); });; 

不是一个真正的解决scheme,但它指出,也许问题是在什么时候,而不是amqplib?

任何想法或帮助不胜感激

简短的回答是:closures连接会放弃所有没有写入套接字的操作。

在编写消息之前,似乎更新版本的when.js(例如v2.5.1)设法调用ensure子句,closures连接。

奇怪的是,它是如此一致 – 我没有看到它与when.js 2.5.1成功,我没有看到它与when.js 2.1.1失败。 无论如何,解决这个问题的方法是在发布之后进行同步。 例如closures频道。

https://github.com/squaremo/amqp.node/issues/28上有更多的细&#x8282;

这是因为我运行'npm install'而不是'npm install amqplib'或'npm install ../ ..'。 这意味着我正在运行'when'的2.5.1版本,它有一些故障的竞争条件,提前closures连接。 当运行版本2.1.1,amqplib被locking,它工作正常。 –