Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 当没有使用者时,获取要在RabbitMQ中持久化的消息_Node.js_Rabbitmq - Fatal编程技术网

Node.js 当没有使用者时,获取要在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

我的场景:我希望我的应用程序将日志发布到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);
});

很多时候,rabbit MQ的常规设置是由发布者声明、交换并发布到它。然后使用者声明相同的交换(如果已经存在,则只确保它存在;如果使用者首先启动,则创建它)。这不适合您的使用。您需要从开始发布到队列的那一刻开始创建队列

发布者必须创建exchange和队列,队列需要

自动删除=错误

,仅当您计划重新启动RabbitMQ服务器时才有帮助。然后,它将发布到exchange,消息将被传递到队列中,等待您的消费者连接到它,然后读取它丢失的所有消息。它必须使用与生产者声明队列时完全相同的队列声明参数。事实上

自动删除=错误


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

经过测试并正常工作!有点超出范围,但如果我用队列声明包装我的发布,这会导致到RabbitMQ的另一次往返吗?或者我的库(用于nodejs的amqp)是否足够智能,可以在给定会话中缓存它已经创建的队列?如果使用固定队列名称,则只需要创建一次。如果它是完全静态的,您甚至可以在代码外部手动创建它。如果您试图创建一个已经存在的队列,它只会确认它的存在。