我有基于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'。但是,即使用新名称进行交换也不会被删除。可能有什么不对?
答案 0 :(得分:4)
在宣布交换时,您应将auto_delete
标记设置为True
。这将在所有通道完成后自动删除交换。
请注意,这意味着只要存在与交易所的有效绑定,它就会保留。如果删除绑定或队列,交换将被删除。
如果您需要保留队列,而不是交换,则可以在完成发布后删除绑定。这应该会自动删除交换。