如何在节点js中只使用来自rabbitmq的一条消息

时间:2015-02-26 16:06:46

标签: node.js rabbitmq

我正在使用amqp.node库将rabbitmq集成到我的系统中。

但是在消费者中我想要当时只处理一条消息,然后确认消息然后消耗队列中的下一条消息。

目前的代码是:

// Consumer
open.then(function(conn) {
  var ok = conn.createChannel();
  ok = ok.then(function(ch) {
    ch.assertQueue(q);
    ch.consume(q, function(msg) {
      if (msg !== null) {
        othermodule.processMessage(msg, function(error, response){
          console.log(msg.content.toString());
          ch.ack(msg);
        });
      }
    });
  });
  return ok;
}).then(null, console.warn);

ch.consume将同时处理通道中的所有消息,并且模块的功能在此处调用othermodule将不会在同一时间线中执行。

我想在使用队列中的下一条消息之前等待othermodule函数完成。

5 个答案:

答案 0 :(得分:2)

目前(2018年),我认为RabbitMQ团队可以选择这样做:

https://www.rabbitmq.com/tutorials/tutorial-two-javascript.html

ch.prefetch(1);
  

为了解决这个问题,我们可以使用预取方法,将其值   之1。这告诉RabbitMQ不要给一个消息多条消息   一次的工人。或者,换句话说,不要向   一个工人,直到它处理并确认上一个工人为止。   相反,它将把它分派给尚不存在的下一个工作程序   忙。

答案 1 :(得分:1)

创建模型时,需要在其上设置QOS。以下是我们在C#中的表现:

    var _model = rabbitConnection.CreateModel();
    // Configure the Quality of service for the model. Below is how what each setting means.
    // BasicQos(0="Dont send me a new message untill I’ve finshed",  _fetchSize = "Send me N messages at a time", false ="Apply to this Model only")
    _model.BasicQos(0, _fetchSize, false);
    var consumerTag = _model.BasicConsume(rabbitQueue.QueueName, false, _consumerName, queueingConsumer);

答案 2 :(得分:0)

答案 3 :(得分:0)

按照此处的示例进行操作:

https://www.npmjs.com/package/amqplib

// Consumer
function consumer(conn) {
  var ok = conn.createChannel(on_open);
  function on_open(err, ch) {
    if (err != null) bail(err);
    ch.assertQueue(q);
    
     // IMPORTANT
    ch.prefetch(1);

    ch.consume(q, function(msg) {
      if (msg !== null) {
        console.log(msg.content.toString());
        ch.ack(msg);
      }
    });
  }
}

参考:http://www.squaremobius.net/amqp.node/channel_api.html#channel_prefetch

答案 4 :(得分:-1)

您必须设置QoS = 1。

ch = ...
ch.qos(1);
ch.consume(q, msg => { ... });

(JavaScript的)