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不支持sendToQueue
或publish
callback。
文档显示这不是一个选项:
频道#sendToQueue承诺和callback
sendToQueue(队列,内容,[选项])
发送一条消息作为缓冲区给定的特定队列,绕过路由。 选项和返回值与发布完全相同。
要解决这个问题,你需要调用sendToQueue
,就好像它是一个同步消息一样。
如果你想立即退出应用程序,你将不得不等待几毫秒才能这样做。 不这样做将导致消息不被发送。
下面是一个如何改变你的代码以这种方式工作的例子:
channel.sendToQueue(_toBlahBlahQueueName, msg, { persistent: true }); setTimeout(function () { channel.connection.close(); callback(null, { message: 'queued' }); }, 500);