2017-09-06 11 views
0

新しいメッセージを発行するたびに、新しい接続が1つ作成されます。すべてのパブリッヒコールに1つの接続と1つのチャネルしか持たせたくありません。ノードアプリケーション用のRbbitMQとの接続は1つだけで、パブリッシュコールは1つではありません。

rabbitmqのWebサイトからお読みください。 AMQPブローカーへの複数の接続が必要なアプリケーションがあります。ただし、同時に多数のTCP接続を開いておくことは、システムリソースを消費し、ファイアウォールを構成するのが難しくなるため、望ましくありません。 AMQP 0-9-1接続は、「単一のTCP接続を共有する軽量接続」と考えることができるチャネルで多重化されています。

しかし、どのように??? は、ここに私のコードです: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

公開機能の外側の接続(amqpConn)および発行者チャネル(pubChannel)を定義し、使用

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

} 

ことメッセージを公開するときに使用します。オフラインキューが場合に使用されてもhttps://gist.github.com/carlhoerberg/006b01ac17a0a94859bahttps://www.cloudamqp.com/blog/2015-05-19-part2-2-rabbitmq-for-beginners_example-and-sample-code-node-js.html) 接続がダウンしてしばらくの間です:

は、私はあなたがここに完全なサンプルコードを見てみることをお勧めします。

また、接続すると、パブリッシャが起動します。

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]); 
    } 
} 
関連する問題