Warten auf eine Einzel-RabbitMQ-Meldung mit einem timeout
Ich würde gerne eine Nachricht senden, die eine RabbitMQ-server und warten dann auf eine Antwort-Nachricht ("reply-to" - Warteschlange). Natürlich, ich will nicht ewig warten, falls die Anwendung die Verarbeitung dieser Nachrichten ist down - muss es ein timeout. Es klingt wie eine sehr einfache Aufgabe sein, doch ich kann nicht einen Weg finden, dies zu tun. Ich habe jetzt dieses problem mit beiden py-amqplib und die RabbitMQ .NET-client.
Die beste Lösung, die ich habe, so weit ist die Umfrage mit basic_get
mit sleep
in-zwischen, aber das ist ziemlich hässlich:
def _wait_for_message_with_timeout(channel, queue_name, timeout):
slept = 0
sleep_interval = 0.1
while slept < timeout:
reply = channel.basic_get(queue_name)
if reply is not None:
return reply
time.sleep(sleep_interval)
slept += sleep_interval
raise Exception('Timeout (%g seconds) expired while waiting for an MQ response.' % timeout)
Sicherlich gibt es einige bessere Weg?
InformationsquelleAutor EMP | 2010-05-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich nur noch timeout support für
amqplib
imcarrot
.Dies ist eine Unterklasse von
amqplib.client0_8.Connection
:http://github.com/ask/carrot/blob/master/carrot/backends/pyamqplib.py#L19-97
wait_multi
ist eine version vonchannel.wait
erhalten können auf eine beliebige Anzahlder Kanäle.
Ich denke, das könnte zusammengefasst werden upstream-irgendwann.
haha 🙂 lustig 🙂
InformationsquelleAutor asksol
Hier ist, was ich am Ende machen .NET-client:
Leider kann ich nicht das gleiche tun mit py-amqplib, weil seine
basic_consume
Methode nicht, rufen Sie die callback-es sei denn, Sie rufenchannel.wait()
undchannel.wait()
unterstützt keine timeouts! Diese dumme Beschränkung (die ich am laufen zu halten) bedeutet, dass, wenn Sie nicht erhalten eine weitere Nachricht dein thread ist eingefroren, für immer.InformationsquelleAutor EMP
Gibt es ein Beispiel hier mit qpid mit einem
msg = q.get(timeout=1)
sollten tun, was Sie wollen. Sorry, ich weiß nicht, was andere AMQP-client-Bibliotheken implementieren timeouts (und insbesondere ich weiß nicht, die zwei bestimmte diejenigen, die Sie erwähnt).basic_consume
mit einer Warteschlange und warten auf die queue mit einem timeout. Sieht aus wie das ist, was ich werde zu tun haben.InformationsquelleAutor Alex Martelli
Diese scheint zu brechen, die die ganze Idee der asynchronen Verarbeitung, aber wenn man muss, glaube ich, der richtige Weg, es zu tun, ist die Verwendung eines RpcClient.
QueueingBasicConsumer
und warten auf die Warteschlange, unterstützt ein timeout. Dies ist nicht so Komplex in .NET wie ich es befürchtet habe.InformationsquelleAutor duffymo
Kaninchen nun ermöglicht Ihnen das hinzufügen timeout-Ereignisse. Einfach wickeln Sie Ihren code in einen try-catch und dann auslösen von Ausnahmen in den TimeOut und Disconnect-Handler:
InformationsquelleAutor Deadly