У меня есть потребитель кролика, который отлично работает (правильно обрабатывает сообщения, отправляет аки и т. д.).
В нем я пытаюсь проверить, пуста ли очередь, используя queue_declare и пассивный флаг (как предлагается здесь: RabbitMQ – Как проверить, пуста ли очередь?).
Соответствующая часть кода выглядит так:
<?php
$a = $this->channel->queue_declare($queueName, true);
var_dump($a);
Моя проблема в том, что он всегда возвращается (независимо от того, сколько сообщений находится в очереди - я тестировал примерно 1000):
array(3) {
[0]=>
string(4) "fastQueue"
[1]=>
int(0)
[2]=>
int(1)
}
Есть идеи, почему?
Обычно размер очереди не имеет отношения к потребителям очереди — это указывает на плохой дизайн системы. Однако существует API управления, который можно использовать для возврата размера очереди, если это действительно то, что вы ищете.
@LukeBakken Я использую последнюю версию RabbitMQ, github.com/php-amqplib/php-amqplib в качестве библиотеки и ... Я вернусь к вам с версией Erlang (я разговариваю по телефону).
@theMayer Меня на самом деле не волнует размер очереди, меня просто волнует, пуста она или нет, потому что я не хочу оставлять соединение открытым, если в очередях ничего нет (если вы можете объяснить, почему это будет плохой системой дизайн, буду признателен). Кроме того, в будущем я на самом деле думал проверить размер очереди и создать дополнительных потребителей / повысить приоритеты процессов для всплесков (опять же, почему это может быть плохим дизайном системы - без сарказма, я искренне спрашиваю).
Basic.Get это то, что вы ищете. Он немедленно возвращается независимо от того, доступно сообщение или нет.






Какую библиотеку PHP вы используете? Какая версия RabbitMQ и Erlang? Не могли бы вы предоставить полный набор кода для воспроизведения?