什么原因导致amqp.node从RabbitMQ服务器获取ECONNRESET?

我有一个在Windows 8环境下运行的RabbitMQ(默认configuration)实例。 我的节点版本是5.1.0,我试图build立他们之间的连接使用amqp.node库为了传递消息。

当我尝试示例代码:

var q = 'tasks'; function bail(err) { console.error(err); process.exit(1); } // Publisher function publisher(conn) { conn.createChannel(on_open); function on_open(err, ch) { if (err != null) bail(err); ch.assertQueue(q); ch.sendToQueue(q, new Buffer('something to do')); } } // Consumer function consumer(conn) { var ok = conn.createChannel(on_open); function on_open(err, ch) { if (err != null) bail(err); ch.assertQueue(q); ch.consume(q, function(msg) { if (msg !== null) { console.log(msg.content.toString()); ch.ack(msg); } }); } } require('amqplib/callback_api') .connect('amqp://guest:guest@localhost:5672', function(err, conn) { if (err != null) bail(err); consumer(conn); publisher(conn); }); 

我知道它工作正常。

但是如果我把这个代码移到我的项目中,我得到这个错误:

ECCONRESET系统调用:读取。

我的应用程序运行express.js和oauth2.0。 即使我把代码放在任何其他语句和模块的要求之前,也是行不通的。

我search了这个错误,我发现一些与负载平衡有关的问题,但我在本地运行它,示例代码工作正常。

我发现的另一个问题可能与TCP连接有关,我把RabbitMQ服务器configuration文件中的握手timout选项改为10000ms,但没有任何改变。

我使用与guest用户相同的URL:amqp:// guest:guest @ localhost:5672,它在示例代码上工作。

来自RabbitMQ的日志显示连接已经完成,但几秒钟后,它表示连接意外closures:

 =INFO REPORT==== 24-Nov-2015::18:09:52 === accepting AMQP connection <0.2644.0> (127.0.0.1:51866 -> 127.0.0.1:5672) =ERROR REPORT==== 24-Nov-2015::18:10:12 === closing AMQP connection <0.2644.0> (127.0.0.1:51866 -> 127.0.0.1:5672): {handshake_timeout,frame_header} 

所以我的问题是:是否有amqp.node和其他图书馆之间的任何冲突,放弃与服务器的连接? 我怎样才能debugging呢?

       

网上收集的解决方案 "什么原因导致amqp.node从RabbitMQ服务器获取ECONNRESET?"

ECONNRESET通常是一个networking错误,这意味着它被强制从它试图build立的TCP / IP连接断开。

您的项目可能会以阻止其正确打开TCP / IP连接的方式运行,或者遇到防火墙或其他问题。

当用户名和密码不好时,我也看到了这个错误。 我强烈build议你设置一个新的用户名和密码,然后向该用户授予正确的权限(这种情况下是默认的虚拟主机)。

除此之外…有时需要玩一些代码来找出造成问题的原因。 如果在复制并粘贴到实际项目中时看不到这个问题,那么项目中可能会有其他事情阻止它正常工作。

PS我build议不要直接使用amqplib。 这是一个很好的驱动程序,但是在它之上有更好的(更友好的)API层,以使生活更轻松。 例如,我最喜欢的是在底层使用amqplib的wascally。 我已经录制了关于所有这些的截屏,在http://RabbitMQ4Devs.com

这个错误与连接和通道有关。 所以在你的代码中,你正在创build一个连接和通道,但不closures它们。 这会产生这个错误(ECONNRESET),当没有。 连接和通道限制已耗尽RabbitMQ将停止接受新的networking连接。 closures通道和连接将解决这个错误。 示例代码:

 amqp.connect('amqp://localhost') .then(function(conn) { return when(conn.createChannel().then(function(ch) { var q = 'hello'; var msg = 'Hello World!'; var ok = ch.assertQueue(q, {durable: true}); return ok.then(function(_qok) { ch.sendToQueue(q, new Buffer(msg), {deliveryMode: true}); console.log(" [x] Sent '%s'", msg); return ch.close(); }); })).ensure(function() { conn.close(); }); }) .then(null, console.warn);