RabbitMQ: Поглотить предмет после завершения предыдущего - PullRequest
0 голосов
/ 26 октября 2018

Я новичок в RabbitMQ.Я хочу выполнить только один элемент за раз, следующий будет использован после завершения предыдущего.

Вот как создается Потребитель:

consumer.assertQueue(queue, { durable: true });
consumer.consume(queue, handleMessage, { noAck: false });

Вотfunction handleMessage:

async function handleMessage(message) {    
    console.log('handleMessage', message.content.toString());
    // wait for 1 second
    await wait(1000); 
    console.log('ACK', message.content.toString());
    consumer.ack(message);
}

Издатель будет отправлять такие элементы:

publisher.sendToQueue(queue, Buffer.from('1'));
publisher.sendToQueue(queue, Buffer.from('2'));

Вот журнал.Кажется, он не ждет, когда процесс дескриптора ожидает 1 секунду до завершения:

handleMessage 1
handleMessage 2
ACK 1
ACK 2

То, что я хочу:

handleMessage 1
ACK 1
handleMessage 2
ACK 2

Среднее сообщение 1 должно быть завершено, прежде чем обрабатывать сообщение 2. Как мне это сделать?Благодаря.

1 Ответ

0 голосов
/ 26 октября 2018

Если у вас одна очередь с одним потребителем, вы можете установить предварительную выборку равной 1.

channel.prefetch(1)

Более подробную информацию вы можете получить из официального документа RabbitMQ:

Значение определяет максимальное количество неподтвержденных доставок, разрешенных на канале. Как только число достигнет настроенного числа, RabbitMQ прекратит доставлять больше сообщений на канал, если не будет подтверждено хотя бы одно из ожидающих сообщений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...