如果接收器未运行,则Node.js RabbitMQ消息丢失

时间:2012-01-26 08:13:41

标签: node.js rabbitmq

这是我遇到的问题

1.如果首先启动接收器,然后发送消息,则发送消息

2但是如果接收器没有启动,那么代码表示发送了消息,但是启动接收器却没有收到消息。

如果我在python中使用pika尝试相同的序列似乎正常工作。

我还验证了没有使用rabbitmqctl --list_queues命令的消息

我正在运行node.js 0.70并在Ubuntu 11.04 64位版本上运行

我的send.js

中有以下代码
   var util= require('util')
   var amqp = require('amqp');

   var connection = amqp.createConnection({host:'localhost',
                                    login:'guest',
                                    password:'guest'});
   var pubMessage = function pubM(msg) {
   var x = connection.exchange();
   var q = connection.queue('helloNode',
            { autoDelete: true, durable: false, exclusive: false }
   );
   x.publish('helloNode',{helloNode: "This is a message"});
   };

   connection.addListener('ready', pubMessage);
   console.log(" Sent a message ");

以及我的接收器中的以下代码

   var util= require('util')
   var amqp = require('amqp');
   var connection = amqp.createConnection({host:'localhost',
                                    login:'guest',
                                    password:'guest'});

   connection.on('ready', function () {
   var q = connection.queue('helloNode',
            { autoDelete: true, durable: false, exclusive: false }
   );
   q.bind('#');

   q.subscribe(function (message) { 
            util.p(message);
   });
   }); 

2 个答案:

答案 0 :(得分:1)

您的队列绑定正在使用autoDelete设置:true。使用此设置,如果接收器未连接(或断开连接),则没有队列将消息路由到。设置autoDelete:false即使接收器离线也会保持队列完整,并且会继续产生消息。

答案 1 :(得分:0)

将邮件路由到“helloNode”队列,然后在发件人终止此队列时删除。即使使用“exclusive:false”也是如此,因为在您的发件人中创建了此队列的订阅。鉴于此,行为“如果在队列中没有激活订阅它将不会被自动删除”这里不适用。

也许pika会创建具有不同值的交换/队列?