RabbitMQ是否有相当于"ping"的功能?如何诊断交换机或队列是否正在广播?

jco*_*lum 9 amqp rabbitmq node.js

我正在使用postwait/node-amqp(链接)连接到我们组织中的各种RabbitMQ交换和队列.

由于我的项目已从开发转移到生产,我遇到了几个问题,队列设置不正确或密码不正确等等.在后一种情况下,很明显,我会收到一个ECONNREFUSED错误.但在第一种情况下,我没有收到任何错误,只是连接超时.

给定一个URI,amqp://USER:PASS@messaging.abc.xyz.com我怎样才能确定一个名为"FooWorkItems.Work"的队列是否接受连接进行监听?这是什么最简单的代码,相当于检查API是在监听还是服务器启动并监听ping港口?

码:

if (this.amqpLib == null) {
    this.amqpLib = require('amqp');
  }
this.connection = this.amqpLib.createConnection({
    url: this.endpoint
  });

  this.connection.on('ready', (function(_this) {
    return function() {
      var evt, _fn, _fn1, _i, _j, _len, _len1, _ref, _ref1;
      _this.logger.info("" + _this.stepInfo + " connected to " + _this.endpoint + "; connecting to " + queueName + "  now.");
      if (_this.fullLogging) {
        _ref = ['connect', 'heartbeat', 'data'];
        _fn = function(evt) {
          return _this.connection.on(evt, function() {
            _this.logger.trace("" + _this.stepInfo + " AMQP event: " + evt);
            if (arguments != null) {
              return _this.logger.trace({
                args: arguments
              });
            }
          });
        };
        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
          evt = _ref[_i];
          _fn(evt);
        }
        _ref1 = ['error', 'close', 'blocked', 'unblocked'];
        _fn1 = function(evt) {
          return _this.connection.on(evt, function() {
            if (evt !== 'close') {
              return _this.logger.error("" + _this.stepInfo + " AMQP event: " + evt);
            } else {
              return _this.logger.warn("" + _this.stepInfo + " AMQP event: " + evt);
            }
          });
        };
        for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
          evt = _ref1[_j];
          _fn1(evt);
        }
      }
      return _this.connection.queue(_this.queueName, {
        passive: true
      }, function(q) {
        logger.debug("" + stepInfo + " connected to queue " + queueName + ". Init complete.");
        return q.subscribe(function(message, headers, deliveryInfo, messageObject) {
          logger.trace("" + stepInfo + " recvd message");
          return logger.trace({
            headers: headers
          });
        });
      });
    };
Run Code Online (Sandbox Code Playgroud)

ist*_*iuk 4

在 amqp 中,队列和交换器是与连接无关的概念,它们不监听或广播,并且您无法连接到它们,只能连接到代理。

RabbitMQ 服务器当然接受网络连接,并且该协议在传输之上定义了heartbeat一个逻辑连接,该连接包括一个心跳,可以使用该库中的选项进行配置。

就像你说的,连接错误,包括超时需要在启动时注意,其余的你可以依靠心跳,类似于“ping”机制。如果连接中断并且您的心跳参数已设置,您的库将简单地抛出错误,因此您无需重新实现此功能。

您还应该查看reconnectpostwait/node-ampq 中的设置,因为它可能会自动处理某些网络故障模式。