Immer wenn ich neue Nachricht veröffentliche, erstellt es eine neue Verbindung. Ich möchte nur eine Verbindung und einen Kanal für alle öffentlichen Anrufe haben.Benötigen Sie nur eine Verbindung mit RbbitMQ für die Knotenanwendung, nicht für jeden Publizierungsaufruf
Lesen Sie von der Rabbitmq Website: Einige Anwendungen benötigen mehrere Verbindungen zu einem AMQP-Broker. Es ist jedoch nicht wünschenswert, viele TCP-Verbindungen gleichzeitig offen zu halten, da dies Systemressourcen beansprucht und die Konfiguration von Firewalls erschwert. AMQP 0-9-1-Verbindungen werden mit Kanälen gemultiplext, die als "leichte Verbindungen, die sich eine einzelne TCP-Verbindung teilen" gedacht werden können.
Aber wie ??? Hier ist mein Code:
Channel.js
var amqp = require('amqplib/callback_api');
var url = process.env.AMQP_URL || 'amqp://guest:[email protected]: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));
}