AMQP Rabbitmq Nodejs - 每次订阅者关闭时都会创建其他发布者

时间:2015-04-23 10:19:49

标签: javascript node.js rabbitmq amqp

我有以下情况:

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条相同的消息。

  • 我认为发生这种情况是因为publisher.js中有3个回调,但我不明白为什么每次订阅者关闭时都会调用这些回调
  • 我如何防止这种情况发生? rabbitmq / amqp是否有任何选项可以强制发布者等待订阅者重新连接。
  • 此外,是否可以在不丢失队列消息的情况下实现此目的,在用户关闭时排队?
  • 首先是订阅者然后是发布者(反之亦然),是否存在差异。这是如何工作的,谁需要创建队列,订阅者或发布者?

编辑:

基于:

  

队列和交换的默认值是在没有消费者(队列)或绑定到队列的队列(交换)时自动删除它们,这种情况在您的情况下发生。

添加“autoDelete:false”可解决问题。

1 个答案:

答案 0 :(得分:1)

队列和交换的默认值是在没有消费者(队列)或绑定到队列的队列(交换)时自动删除它们,这种情况在您的情况下发生。

添加错误事件处理程序时可以看到:

queue_connection.on('error', console.log);

当发生这种情况时,RabbitMQ将关闭连接,amqp驱动程序重新连接,重新发出ready事件,然后重新创建交换。

但是,之前的交换实例(来自第一个连接)仍然在运行并继续发布消息(这显然是有效的,尽管我怀疑消息被丢弃了。)

因此,在第一次重新连接后,您有两个发布者发送消息。断开订户连接,获取错误,重新连接,然后启动第三个发布者。等

您可能需要跟踪连接状态,因此请确保在重置连接时清理所有交换或队列实例。