每当我发布新消息时,它都会创建一个新连接。我希望所有的公共呼叫都只有一个连接和一个通道。
从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));
}
答案 0 :(得分:0)
在发布功能之外定义您的连接(amqpConn)和发布者通道(pubChannel),并在发布消息时使用该通道。
我建议您在此处查看完整的示例代码:https://gist.github.com/carlhoerberg/006b01ac17a0a94859ba (https://www.cloudamqp.com/blog/2015-05-19-part2-2-rabbitmq-for-beginners_example-and-sample-code-node-js.html) 如果连接断开一段时间,也会使用脱机队列。
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]);
}
}