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

为什么我们需要setTimeout来用javascript关闭rabbitMQ中的连接,rabbitmq,Rabbitmq,我将rabbitMQ与javascript一起使用。rabbitMQ提供的所有示例都使用大约500ms的setTimeout关闭连接。当我尝试与任何延迟冷连接,然后事情没有锻炼 var amqp = require('amqplib/callback_api'); amqp.connect('amqp://localhost', function(err, conn) { conn.createChannel(function(err, ch) { var ex = 'logs';

我将rabbitMQ与javascript一起使用。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)


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

通过在任何受支持的地方使用回调函数,包括您正在进行的
assertExchange
调用,您可以减少对
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}, function(){
      ch.publish(ex, '', new Buffer(msg));
      console.log(" [x] Sent %s", msg);

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

  });
});
在哪里放置
process.exit()
调用很重要

通过将它放在最后一次回调中,您有更好的机会不需要设置超时。但是,不支持回调。如果消息发布延迟,立即退出仍可能导致消息无法发送


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

  });
});