2017-09-06 3 views
0

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)); 
} 

Antwort

0

Ihre Verbindung definieren (amqpConn) und Verleger Kanal (pubChannel) außerhalb der Funktion veröffentlichen und zu verwenden, die Kanal, wenn Sie eine Nachricht veröffentlichen.

empfehle ich Sie bei dem vollen Beispielcode einen Blick zu nehmen hier: 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) Wo auch eine Offline-Warteschlange im Fall verwendet wird, wird die Verbindung nach unten für eine Weile.

Und wenn Sie verbunden sind, starten Sie den Herausgeber.

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]); 
    } 
}); 

}

Und die veröffentlichen Funktion wie:

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]); 
    } 
} 
Verwandte Themen