Node.js 当没有使用者时,获取要在RabbitMQ中持久化的消息
我的场景:我希望我的应用程序将日志发布到RabbitMQ,并让另一个进程使用这些日志并写入数据库。此外,日志应该保存在RabbitMQ中,即使此时没有使用者。然而,使用我现在拥有的代码,我的日志不会显示在RabbitMQ中,除非我启动一个使用者。我做错了什么 我的代码:Node.js 当没有使用者时,获取要在RabbitMQ中持久化的消息,node.js,rabbitmq,Node.js,Rabbitmq,我的场景:我希望我的应用程序将日志发布到RabbitMQ,并让另一个进程使用这些日志并写入数据库。此外,日志应该保存在RabbitMQ中,即使此时没有使用者。然而,使用我现在拥有的代码,我的日志不会显示在RabbitMQ中,除非我启动一个使用者。我做错了什么 我的代码: var amqp = require('amqp'); var connection = amqp.createConnection({ host: "localhost", port: 5672 }); co
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);
});
很多时候,rabbit MQ的常规设置是由发布者声明、交换并发布到它。然后使用者声明相同的交换(如果已经存在,则只确保它存在;如果使用者首先启动,则创建它)。这不适合您的使用。您需要从开始发布到队列的那一刻开始创建队列 发布者必须创建exchange和队列,队列需要 自动删除=错误 ,仅当您计划重新启动RabbitMQ服务器时才有帮助。然后,它将发布到exchange,消息将被传递到队列中,等待您的消费者连接到它,然后读取它丢失的所有消息。它必须使用与生产者声明队列时完全相同的队列声明参数。事实上 自动删除=错误
它将确保无论消费者何时上上下下,它都将保持活动状态并保留消息。经过测试并正常工作!有点超出范围,但如果我用队列声明包装我的发布,这会导致到RabbitMQ的另一次往返吗?或者我的库(用于nodejs的amqp)是否足够智能,可以在给定会话中缓存它已经创建的队列?如果使用固定队列名称,则只需要创建一次。如果它是完全静态的,您甚至可以在代码外部手动创建它。如果您试图创建一个已经存在的队列,它只会确认它的存在。