Javascript AMQP Rabbitmq Nodejs—每次订阅服务器关闭时创建的附加发布服务器

Javascript AMQP Rabbitmq Nodejs—每次订阅服务器关闭时创建的附加发布服务器,javascript,node.js,rabbitmq,amqp,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', { typ

目前我有以下情况:


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时,subscriber将接收到没有任何问题的消息。 但若我关闭订阅服务器,并再次启动它(不关闭并启动publisher.js),订阅服务器将同时开始接收3条相同的消息

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

编辑:

基于:


队列和交换的默认设置是,当没有消费者(用于队列)或队列(用于交换)绑定到它们时(在您的情况下)自动删除它们


添加“autoDelete:false”解决了一个问题。

队列和交换的默认设置是,当没有消费者(用于队列)或队列(用于交换)绑定到它们时(在您的情况下),会自动删除它们

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

queue_connection.on('error', console.log);
当这种情况发生时,RabbitMQ关闭连接,
amqp
驱动程序重新连接,它重新发出
ready
事件,然后您重新创建交换

但是,前一个exchange实例(来自第一个连接)仍在运行,并且一直在发布消息(这显然是有效的,尽管我怀疑消息被删除)

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

您可能需要跟踪连接的状态,以便确保在重置连接时清除所有exchange或队列实例。

确实如此。添加“autoDelete:false”作为exchange选项之一似乎可以解决此问题。