Node.js 对于节点应用程序,而不是每个发布调用,只需要一个与RbbitMQ的连接

Node.js 对于节点应用程序,而不是每个发布调用,只需要一个与RbbitMQ的连接,node.js,rabbitmq,messagebroker,Node.js,Rabbitmq,Messagebroker,每当我发布新消息时,它都会创建一个新连接。我只想有一个连接和一个频道的所有公共电话 阅读rabbitmq网站: 某些应用程序需要到AMQP代理的多个连接。但是,不希望同时打开多个TCP连接,因为这样做会消耗系统资源,并且使防火墙的配置更加困难。AMQP 0-9-1连接与可被视为“共享单个TCP连接的轻量级连接”的通道进行多路复用 但是怎么办??? 这是我的密码: Channel.js var amqp = require('amqplib/callback_api'); var url = p

每当我发布新消息时,它都会创建一个新连接。我只想有一个连接和一个频道的所有公共电话

阅读rabbitmq网站: 某些应用程序需要到AMQP代理的多个连接。但是,不希望同时打开多个TCP连接,因为这样做会消耗系统资源,并且使防火墙的配置更加困难。AMQP 0-9-1连接与可被视为“共享单个TCP连接的轻量级连接”的通道进行多路复用

但是怎么办??? 这是我的密码:

Channel.js

var amqp = require('amqplib/callback_api');

var url = process.env.AMQP_URL || 'amqp://guest:guest@localhost:5672';

module.exports = createQueueChannel;

function createQueueChannel(queue, cb) {
  console.log("connecting................");
  amqp.connect(url, onceConnected);

  function onceConnected(err, conn) {
    if (err) {
      console.error('Error connecting:', err.stack);
    }
    else {
      console.log('connected');
      conn.createChannel(onceChannelCreated);
    }

    function onceChannelCreated(err, channel) {
      if (err) {
        cb(err);
      }
      else {
        channel.assertQueue(queue, {durable: true}, onceQueueCreated);
      }

      function onceQueueCreated(err) {
        if (err) {
          cb(err);
        }
        else {
          cb(null, channel, conn);
        }
      }
    }
  }

}
Publish.js

var Channel = require('./channel');

var queue = 'queue';

Channel(queue, function(err, channel, conn) {
  if (err) {
    console.error(err.stack);
  }
  else {
    console.log('channel and queue created');
    var work = 'Do some work';
    channel.sendToQueue(queue, encode(work), {
      persistent: true
    });
    // setImmediate(function() {
    //   channel.close();
    //   conn.close();
    // });
  }
});


function encode(doc) {
  return new Buffer(JSON.stringify(doc));
}
在发布功能之外定义您的连接(amqpConn)和发布者频道(pubChannel),并在发布邮件时使用该频道

我建议您在此处查看完整的示例代码: () 其中还使用脱机队列,以防连接中断一段时间

var amqpConn = null;
function start() {
  amqp.connect(process.env.URL + "?heartbeat=60", function(err, conn) {
    if (err) {
      console.error("[AMQP]", err.message);
      return setTimeout(start, 1000);
    }
    conn.on("error", function(err) {
      if (err.message !== "Connection closing") {
        console.error("[AMQP] conn error", err.message);
      }
    });
    conn.on("close", function() {
      console.error("[AMQP] reconnecting");
      return setTimeout(start, 1000);
    });
    console.log("[AMQP] connected");
    amqpConn = conn;
    whenConnected();
  });
}
连接后,启动发布服务器

function whenConnected() {
  startPublisher()
}


var pubChannel = null;
var offlinePubQueue = [];
function startPublisher() {
  amqpConn.createConfirmChannel(function(err, ch) {
  if (closeOnErr(err)) return;
    ch.on("error", function(err) {
    console.error("[AMQP] channel error", err.message);
  });
  ch.on("close", function() {
    console.log("[AMQP] channel closed");
  });

  pubChannel = ch;
  while (true) {
    var m = offlinePubQueue.shift();
    if (!m) break;
    publish(m[0], m[1], m[2]);
  }
});
}

发布功能如下:

function publish(exchange, routingKey, content) {
  try {
    pubChannel.publish(exchange, routingKey, content, { persistent: true },
      function(err, ok) {
        if (err) {
          console.error("[AMQP] publish", err);
          offlinePubQueue.push([exchange, routingKey, content]);
          pubChannel.connection.close();
        }
      }
    );
  } catch (e) {
    console.error("[AMQP] publish", e.message);
    offlinePubQueue.push([exchange, routingKey, content]);
  }
}