当没有消费者时,获取留在RabbitMQ中的消息

时间:2014-03-13 18:42:03

标签: node.js rabbitmq

我的场景:我希望我的应用程序将日志发布到RabbitMQ并让另一个进程使用这些日志并写入数据库。此外,即使目前没有消费者,日志也应该保留在RabbitMQ中。但是,根据我现在的代码,我的日志不会出现在RabbitMQ中,除非我启动了一个消费者。我究竟做错了什么?

我的代码:

var amqp = require('amqp');
var connection = amqp.createConnection({
    host: "localhost",
    port: 5672
});

connection.on('ready', function() {
    // Immediately publish
    setTimeout(function() {
        connection.publish('logs',
            new Buffer('hello world'), {},
            function(err, res) {
                console.log(err, '|', res);
            });
    }, 0);

    // Wait a second to subscribe
    setTimeout(function() {
        connection.queue('logs', function(q) {
            q.subscribe(function(message) {
                console.log(message.data);
            });
        });
    }, 1000);
});

1 个答案:

答案 0 :(得分:4)

很多时候,使用兔子MQ的一般设置是让发布者声明并交换和发布它。然后,消费者声明相同的交换(如果消费者已经存在则确保它存在,并且如果消费者首先开始则创建它)。这对您的使用不正确。您需要在开始发布时创建队列。

发布者必须创建交换和队列,队列必须是

  

自动删除=假

,持久性只有在您计划重新启动RabbitMQ服务器时才有用。然后它会发布到交换机,消息将被传递到队列,在那里它们将等待消费者连接到它,然后读取它错过的所有消息。它必须使用与生成器在声明队列时所做的完全相同的队列声明参数。因为它是

  

自动删除=假

它将确保无论消费者何时上下,它都会保持活力并保留消息。