RabbitMQ — Как проверить, пуста ли очередь?

У меня есть интерфейс веб-службы, который абстрагирует сервер RabbitMQ (не спрашивайте меня почему, я знаю, что это ненужный шаг, но я должен это сделать). То есть я опрашиваю сообщения из очереди через вызов веб-службы, а не напрямую amqp,

Потребляя через basic.consumer блокирует поток выполнения до появления сообщений в очереди. Это заставляет веб-сервис не возвращаться.

Код для иллюстрации:

    $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare(QUEUE_NAME, false, true, false, false);
$ret = array('body' => '');

$callback = function($msg) use ($channel, &$ret) {
$ret['body'] = $msg->body;
/*
Here I would basic.cancel the consumer if there were no messages in the queue
*/
};

$channel->basic_consume(QUEUE_NAME, 'tag', false, true, false, false, $callback);

if (count($channel->callbacks)) {
$channel->wait(); // blocks here...
}

return $ret;

1

Решение

Если вы хотите узнать размер очереди, вы можете позвонить queue_declare у php-amqlib вторым аргументом возврата является количество сообщений в очереди.

  list($queue, $messageCount, $consumerCount) = $channel->queue_declare(QUEUE_NAME, true);

При вызове метода queue_declare () важно присвоить аргументу $ passive значение true.

5

Другие решения

То, что я хотел сделать, достигнуто basic.get,

В php-amqlib:

$channel->basic_get(QUEUE_NAME, true); // the second arg is no_ack,

Тем не менее, я до сих пор не понимаю, что делает этот второй аргумент, но исключая его (имея его = false), я получаю сообщение не в верхней части. В любом случае, решено.

Как я выяснил (и другие, упомянутые ниже), второй аргумент отмечает, что для этого сообщения подтверждения не ожидается. То есть вам не нужно «помечать» сообщение как прочитанное для RabbitMQ, чтобы уверенно удалить его из очереди.

Почему все это хлопотно?

Я упаковывал код RabbitMQ в веб-сервис http. И это не очень хорошая идея (по крайней мере, для моего случая использования). Когда веб-служба возвращается и, таким образом, соединение rabbitmq завершается, не подтвержденное (пока) сообщение отправляется обратно в очередь. Итак, если вам нужно принять оболочку http, убедитесь, что вы изолировали время жизни соединения rabbitmq от времени http запроса lieftime. Тем не менее, я не пробовал это.

2

По вопросам рекламы [email protected]