【问题标题】:How to stop consuming message from selective queue - RabbitMQ - Javascript/node如何停止从选择性队列消费消息 - RabbitMQ - Javascript/node
【发布时间】:2017-03-29 12:02:58
【问题描述】:

我正在构建一个 REST-amqp 示例,其中我从 rabbitmq 中的给定队列获取消息,然后通过 REST 将消息发送回客户端。

我已经按照rabbitmq教程为node.js实现了代码

var amqp = require('amqplib/callback_api');
amqp.connect('amqp://192.168.225.203:5672', function (err, conn) {
conn.createChannel(function (err, ch) {
    var q = 'aQueue';
    ch.assertQueue(q, { durable: false });
    var messages = [];
    console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q);
    ch.consume(q, function (msg) {
        console.log(" [x] Received %s", msg.content.toString());
        messages.push(msg.content.toString());
        messages.forEach(function(element) {
            console.log(element);
        });
    }, { noAck: true });
});

});

我可以将所有消息合并到一个数组(消息)中,但是这个函数一直运行到应用程序停止,这不是一件好事,因为 REST 客户端将永远等待...... 如果第一个选项不可行,我想在队列为空或一段时间(2 秒)后停止该功能并继续执行该程序。 我发现在 Java 中解决了同样的问题,但在 JS 中没有解决。

非常感谢任何提示。

干杯,乔瓦尼

【问题讨论】:

    标签: javascript node.js rabbitmq amqp


    【解决方案1】:

    您可以使用connection#close 完全停止连接并按需建立一个新连接。

    但是,您仍然需要检测何时来终止连接。

    请问这背后的动机究竟是什么? HTTP/REST 和消息队列本质上是不同的。基于 HTTP 请求发送消息是一回事;接收某个请求的消息绝对是我不会主动去的地方。

    【讨论】:

    • 谢谢伙计,是的……“何时”可能是基于时间的,也可能是队列为空的。我仍然有“如何”的问题。 setInterval 和 setTimeout 是异步的,因此即使我在该函数中放置一个“返回”也不会在我的函数上工作。关于这背后的哲学原因,我同意你的看法,这是一个技术演示,而不是一个真实的案例场景。
    • 我建议使用 Promises 来完成这项工作。管理操作要容易得多,您可以使用明确定义的转义路径在特定点保释(拒绝承诺或抛出异常,添加.catch disconnecting)。
    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2022-07-03
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多