为什么我们需要setTimeout来关闭使用javascript的rabbitMQ中的连接

时间:2016-03-10 06:17:19

标签: rabbitmq

我正在使用带有javascript的rabbitMQ。 RabbitMQ提供的所有示例都是使用大约500ms的setTimeout关闭连接。当我尝试用任何延迟来收集连接时,那些东西都没有锻炼。

var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var ex = 'logs';
    var msg = process.argv.slice(2).join(' ') || 'Hello World!';

    ch.assertExchange(ex, 'fanout', {durable: false});
    ch.publish(ex, '', new Buffer(msg));
    console.log(" [x] Sent %s", msg);
  });
  

setTimeout(function(){conn.close(); process.exit(0)},500);

});

1 个答案:

答案 0 :(得分:0)

几乎所有的amqplib和rabbitmq操作都是异步的。如果您立即退出应用程序,则无法保证操作已完成。

您可以通过在支持的任何位置使用回调函数来减少对setTimeout的需求,包括您正在进行的assertExchange来电:


var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var ex = 'logs';
    var msg = process.argv.slice(2).join(' ') || 'Hello World!';

    ch.assertExchange(ex, 'fanout', {durable: false}, function(){
      ch.publish(ex, '', new Buffer(msg));
      console.log(" [x] Sent %s", msg);

      conn.close(); 
      process.exit(0);
    });

  });
});

您放置process.exit()电话非常重要。

通过将其置于最后一个回调中,您更有可能不需要设置超时。但是,the publish method of amqplib不支持回调。如果发布消息有延迟,立即退出仍可能导致消息无法发送。