2

我有最新版本的 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 控制台,我可以看到它创建了连接,它创建了队列“hello”。但是,它实际上并没有向队列发布任何消息。

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

我的一位朋友使用除了 OS X 10.6 而不是 10.8 之外的所有相同版本运行良好。

我已经使用节点检查器逐步检查了 amqplib 代码,并且看不到任何明显的错误。看起来确实没有创建消息框架,但是在那个级别上,我不知道目前发生了什么。

当我通过 Web 控制台或使用 Bunny + Ruby 发布消息时,它会创建一个队列并按预期发布一条消息,因此 node、amqp 和/或 OS X 10.8 而不是 rabbitmq 一定有问题。

rabbitmq 日志(同时跟踪两个日志)只提到连接打开然后很快关闭,但不报告任何错误:

=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 的数据包。这来自 amqp.node 运行示例/教程中的第一个示例“send.js”:

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

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

这个来自 ruby​​/bunny - 你可以看到它是如何打开连接、创建队列和发布消息的。

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

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

例如

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

不是真正的解决方案,但它指出问题可能出在“何时”而不是 amqplib ?

非常感谢任何想法或帮助

4

2 回答 2

0

简短的回答是:关闭连接会放弃任何尚未写入套接字的操作。

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

也许奇怪的是,它是如此一致——我没有看到它在 when.js 2.5.1 上成功,我也没有看到它在 when.js 2.1.1 上失败。无论如何,修复它的方法是在发布后同步某些东西;例如,关闭频道。

https://github.com/squaremo/amqp.node/issues/28有更多细节

于 2013-10-31T15:47:25.270 回答
0

这是因为我运行了 'npm install' 而不是 'npm install amqplib' 或 'npm install ../..' 。这意味着我正在运行 'when' 的 2.5.1 版本,它具有某种故障竞争条件,会过早关闭连接。当运行 amqplib 锁定的 2.1.1 版本时,它工作正常。–

于 2015-05-20T01:39:22.197 回答