node.js imqplib sendToQueue到RabbitMQ挂起

Dav*_*ney 2 rabbitmq node.js

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

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);
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

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

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

服务器日志中有错误消息:客户端意外关闭了TCP连接

谢谢你的帮助!

Der*_*ley 5

amqplib不支持sendToQueue或的回调publish

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

Channel#sendToQueue承诺和回调

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

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

要解决此问题,您需要sendToQueue像调用同步消息一样进行调用。

如果要立即退出该应用程序,则必须等待几毫秒后再退出。否则将导致无法发送消息。

这是一个示例,说明如何更改代码以这种方式工作:

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