amqp交换不会被自动删除

时间:2014-09-12 05:55:39

标签: node.js rabbitmq amqp

我有基于amqplib 0.2.1

的rabbitmq 3.3.5运行和nodejs项目

问题是,一旦断言交换,它就会在连接到rabbitmq后关闭。

如果我们开始这样的例子

var amqp = require('amqplib');
var when = require('when');

amqp.connect('amqp://localhost').then(function(conn) {
  return when(conn.createChannel().then(function(ch) {
    var ex = 'logs_new';
    var ok = ch.assertExchange(ex, 'fanout', {durable: false, autoDelete: true}})

    var message = process.argv.slice(2).join(' ') ||
      'info: Hello World!';

    return ok.then(function() {
      ch.publish(ex, '', new Buffer(message));
      console.log(" [x] Sent '%s'", message);
      return ch.close();
    });
  })).ensure(function() { conn.close(); });
}).then(null, console.warn);

并运行

#rabbitmqctl list_exchanges

列出交换......

amq.rabbitmq.log        topic
amq.rabbitmq.trace      topic
amq.topic       topic
logs_new    fanout
...done.

虽然与rabbitmq的连接已关闭,但交换(logs_new)仍然存在。

如果任何连接没有使用交换机,如何告诉rabbitmq交换机是否需要删除?

编辑: 正如http://www.squaremobius.net/amqp.node/doc/channel_api.html所述,autoDelete选项应为'true'。但是,即使用新名称进行交换也不会被删除。可能有什么不对?

1 个答案:

答案 0 :(得分:4)

在宣布交换时,您应将auto_delete标记设置为True。这将在所有通道完成后自动删除交换。

请注意,这意味着只要存在与交易所的有效绑定,它就会保留。如果删除绑定或队列,交换将被删除。

如果您需要保留队列,而不是交换,则可以在完成发布后删除绑定。这应该会自动删除交换。