node.js imqplib sendToQueue到RabbitMQ挂起

我有一个排队消息到RabbitMQ的function,如下所示:

var amqp = require('amqplib/callback_api'); var _queueURL = 'amqp://127.0.0.1'; var _toBlahBlahQueueName = 'blahblah'; var self = module.exports = { queueMessage: function (msgObj, callback) { try { amqp.connect(_queueURL, function (err, connection) { if (err) { callback(err); } connection.createChannel(function (err, channel) { if (err) { callback(err); } channel.assertQueue(_toBlahBlahQueueName, { durable: true }, function (err, _ok) { if (err) { callback(err); } var msg = new Buffer(JSON.stringify(msgObj)); channel.sendToQueue(_toBlahBlahQueueName, msg, { persistent: true }, function (err, ok) { if (err) { console.log(err); callback(err); } console.log('published', ok); channel.connection.close(); callback(null, { message: 'queued' }); }); }); }); }); } catch (e) { console.log(e.stack); callback(e); } } }; 

我正在用函数queueMessage调用长度大约为250K的消息。

sendToQueue调用每次都挂起。 它只是坐在那里,没有返回一个错误。 但是,这个消息似乎在排队!

服务器日志有错误消息:客户端意外closuresTCP连接

谢谢你的帮助!

amqplib不支持sendToQueuepublishcallback。

文档显示这不是一个选项:

频道#sendToQueue承诺和callback

sendToQueue(队列,内容,[选项])

发送一条消息作为缓冲区给定的特定队列,绕过路由。 选项和返回值与发布完全相同。

要解决这个问题,你需要调用sendToQueue ,就好像它是一个同步消息一样。

如果你想立即退出应用程序,你将不得不等待几毫秒才能这样做。 不这样做将导致消息不被发送。

下面是一个如何改变你的代码以这种方式工作的例子:

 channel.sendToQueue(_toBlahBlahQueueName, msg, { persistent: true }); setTimeout(function () { channel.connection.close(); callback(null, { message: 'queued' }); }, 500);