RabbitMQ - Wie um zu prüfen, ob queue leer ist?
Ich habe eine web-service-Schnittstelle, die abstracts ein RabbitMQ-server (fragt mich nicht warum, ich weiss es ist ein unnötiger Schritt, aber ich muss). Das ist, ich Umfrage die Nachrichten aus der Warteschlange über einen web-service aufrufen, nicht direkt über amqp
.
Konsum über basic.consumer
blockiert die Ausführung Gewinde bis gibt es Nachrichten in der queue. Dies macht die web-service nicht zurück.
Code für die Abbildung:
$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;
- mögliche Duplikate von RabbitMQ - Holen Sie sich die Gesamtzahl der Nachrichten in die Warteschlange eingereiht
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, um die Größe der Warteschlange sind, können Sie anrufen
queue_declare
mit php-amqlib, das zweite argument von return ist die Anzahl der Nachrichten in der Warteschlange.Es ist wichtig, um die $passiv-argument auf true, wenn Sie rufen Sie die queue_declare () - Methode
Was ich tun wollte, ist erreicht
basic.get
.In php-amqlib:
$channel->basic_get(QUEUE_NAME, true); //the second arg is no_ack
.Das zweite argument kennzeichnet, dass keine Bestätigung erwartet wird, für die Nachricht. Das heißt, Sie müssen nicht "Flagge", eine Nachricht als gelesen für RabbitMQ, um sicher zu entfernen Sie es. Ohne es (es = false) Ergebnisse in nicht knallen die top-Nachricht.
Warum all diese Mühe?
War ich die Verpackung des RabbitMQ-code, der in eine http-web-service. Und das ist keine gute Idee (zumindest für meinen Anwendungsfall). Als wenn der web-service liefert und damit die rabbitmq-Verbindung beendet, die nicht (noch nicht) anerkannt Nachricht ist requeued zurück in die Warteschlange. Also, wenn Sie haben zu verfolgen eine http-wrapper, stellen Sie sicher, Sie isolieren die Lebensdauer der rabbitmq-Verbindung vom http-request-lieftime. Allerdings habe ich nicht versuchen, diese.