Ich habe einen AMQP-Server ( RabbitMQ ), die ich in einem Buch veröffentlichen und lesen möchte. Tornado-Webserver . Um dies zu tun, dachte ich, ich würde eine asynchrone amqp Python-Bibliothek verwenden; insbesondere Pika (eine Variante davon, die angeblich Tornado unterstützt).
Ich habe Code geschrieben, der erfolgreich aus der Warteschlange zu lesen scheint, außer, dass am Ende der Anforderung, ich eine Ausnahme erhalten (der Browser kehrt gut):
[E 101219 01:07:35 web:868] Uncaught exception GET / (127.0.0.1)
HTTPRequest(protocol='http', host='localhost:5000', method='GET', uri='/', version='HTTP/1.1', remote_ip='127.0.0.1', remote_ip='127.0.0.1', body='', headers={'Host': 'localhost:5000', 'Accept-Language': 'en-us,en;q=0.5', 'Accept-Encoding': 'gzip,deflate', 'Keep-Alive': '115', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0', 'If-None-Match': '"58f554b64ed24495235171596351069588d0260e"'})
Traceback (most recent call last):
File "/home/dave/devel/lib/python2.6/site-packages/tornado/web.py", line 810, in _stack_context
yield
File "/home/dave/devel/lib/python2.6/site-packages/tornado/stack_context.py", line 77, in StackContext
yield
File "/usr/lib/python2.6/contextlib.py", line 113, in nested
yield vars
File "/home/dave/lib/python2.6/site-packages/tornado/stack_context.py", line 126, in wrapped
callback(*args, **kwargs)
File "/home/dave/devel/src/pika/pika/tornado_adapter.py", line 42, in _handle_events
self._handle_read()
File "/home/dave/devel/src/pika/pika/tornado_adapter.py", line 66, in _handle_read
self.on_data_available(chunk)
File "/home/dave/devel/src/pika/pika/connection.py", line 521, in on_data_available
self.channels[frame.channel_number].frame_handler(frame)
KeyError: 1
Ich bin mir nicht ganz sicher, ob ich diese Bibliothek richtig verwende, es kann also sein, dass ich etwas eklatant falsch mache. Der grundlegende Fluss von meinem Code ist:
- Anfrage kommt rein
- Verbindung zu RabbitMQ mit TornadoConnection erstellen; einen Callback angeben
- In connection callback einen Kanal erstellen, meine Warteschlange deklarieren/binden und basic_consume aufrufen; einen callback angeben
- In consume callback schließen Sie den Kanal und rufen die Funktion finish von Tornado auf.
- Siehe Ausnahme.
Ich habe ein paar Fragen:
- Ist dieser Fluss überhaupt korrekt? Ich bin nicht sicher, was der Zweck der Verbindung Callback ist, außer dass es nicht funktioniert, wenn ich es nicht verwenden.
- Sollte ich eine AMQP-Verbindung pro Webanforderung erstellen? Die Dokumentation von RabbitMQ legt nahe, dass ich das nicht tun sollte, sondern dass ich nur Kanäle erstellen sollte. Aber wo würde ich die Verbindung erstellen und wie kann ich versuchen, die Verbindung wiederherzustellen, wenn sie kurzzeitig ausfällt?
- Wenn ich eine AMQP-Verbindung pro Webanforderung herstelle, wo sollte ich sie schließen? Der Aufruf von amqp.close() in meinem Callback scheint die Dinge noch mehr zu vermasseln.
Ich werde versuchen, etwas später einen Beispielcode hochzuladen, aber die Schritte, die ich oben beschrieben habe, legen die verbrauchende Seite der Dinge ziemlich vollständig dar. Ich habe Probleme mit der Veröffentlichung Seite als gut, aber der Verbrauch von Warteschlangen ist dringender.
0 Stimmen
Den Code selbst zu sehen ist viel besser als eine verbale Erklärung zu lesen.