我的场景:我希望我的应用程序将日志发布到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);
});
答案 0 :(得分:4)
很多时候,使用兔子MQ的一般设置是让发布者声明并交换和发布它。然后,消费者声明相同的交换(如果消费者已经存在则确保它存在,并且如果消费者首先开始则创建它)。这对您的使用不正确。您需要在开始发布时创建队列。
发布者必须创建交换和队列,队列必须是
自动删除=假
,持久性只有在您计划重新启动RabbitMQ服务器时才有用。然后它会发布到交换机,消息将被传递到队列,在那里它们将等待消费者连接到它,然后读取它错过的所有消息。它必须使用与生成器在声明队列时所做的完全相同的队列声明参数。因为它是
自动删除=假
它将确保无论消费者何时上下,它都会保持活力并保留消息。