@NkDev

Как в RabbitMQ обработать все сообщения а затем удалить очередь и закрыть соединение?

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

Мне НЕ нужно постоянно слушать эту очередь и ждать новых сообщений.
Нужно только обработать те сообщения, которые уже есть в очереди, и завершить работу скрипта.

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

<?php

$queue = 'my_queue';
$connection = new AMQPStreamConnection('rabbitmq', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare($queue, false, true, false, false);

$callback = function (AMQPMessage $msg) {
    echo json_decode($msg->body, true);
    $msg->ack();
};

$channel->basic_qos(null, 1, null);
$channel->basic_consume($queue, '', false, false, false, false, $callback);

while (count($channel->callbacks)) {
    $channel->wait();
}

$channel->queue_delete($queue);
$channel->close();
$connection->close();


Скажите, в чем моя ошибка и помогите доработать этот скрипт.
Спасибо!
  • Вопрос задан
  • 315 просмотров
Решения вопроса 2
2ord
@2ord
Странная затея насчёт удаления очереди.
Ну если так надо, то отправляй сообщение о том, что окончились сообщения. Тогда обработчик очереди получит его и будет знать, что очередь можно удалять.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Очередь - бесконечная по дизайну. Поэтому прикладной софт никогда сам не может решить
прочитал-ли он последнее сообщение или нет. Сетевой протокол тоже в этом смысле не помошник
потому-что шлет сообщения пачками и тоже нельзя гарантировать что пачка - последняя.

Единственный разумный выход - если producer создает специальное сообщение-терминатор
которое как-бы сигнализирует что все дескыть конец.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@yarkin
Я не из мира PHP, но полагаю что можно попробовать basic_get вместо basic_consume, или попробовать опцию $nowait=true
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы