我有以下情况:
publisher.js:
var queue_connection = new amqp.createConnection( { host: config.rabbitmq.host, port: config.rabbitmq.port } );
queue_connection.on( 'ready', function () {
var exchange = queue_connection.exchange( 'http_worker', { type: 'topic' } );
exchange.on( 'open', function(){
setInterval(function(){
exchange.publish( 'AZ', 'This is test message' );
logger.info( 'AZ message pushed' );
}, 1000);
})
});
subscriber.js:
var connection = amqp.createConnection({ host: config.rabbitmq.host, port: config.rabbitmq.port });
connection.on( 'ready', function () {
connection.queue( 'AZ', function ( q ) {
q.bind( 'http_worker', 'AZ' );
q.subscribe(function ( message ) {
console.log(unescape( message.data ))
});
});
});
上面的例子很好用。当我启动publisher.js和subscriber.js时,订阅者将收到没有任何问题的消息。 但是,如果我关闭订阅者并重新启动它(不关闭并启动publisher.js),订阅者将立即开始接收3条相同的消息。
编辑:
基于:
队列和交换的默认值是在没有消费者(队列)或绑定到队列的队列(交换)时自动删除它们,这种情况在您的情况下发生。
添加“autoDelete:false”可解决问题。
答案 0 :(得分:1)
队列和交换的默认值是在没有消费者(队列)或绑定到队列的队列(交换)时自动删除它们,这种情况在您的情况下发生。
添加错误事件处理程序时可以看到:
queue_connection.on('error', console.log);
当发生这种情况时,RabbitMQ将关闭连接,amqp
驱动程序重新连接,重新发出ready
事件,然后重新创建交换。
但是,之前的交换实例(来自第一个连接)仍然在运行并继续发布消息(这显然是有效的,尽管我怀疑消息被丢弃了。)
因此,在第一次重新连接后,您有两个发布者发送消息。断开订户连接,获取错误,重新连接,然后启动第三个发布者。等
您可能需要跟踪连接状态,因此请确保在重置连接时清理所有交换或队列实例。