Tengo un servidor AMQP (RabbitMQ) del que me gustaría publicar y leer en un Tornado web server. Para hacer esto, pensé que usaría una biblioteca asíncrona de python amqp; en particular Pika (una variación de la que supuestamente es compatible con Tornado).Uso de Tornado con Pika para monitoreo de colas asíncronas
He escrito código que aparece a leer con éxito de la cola, excepto que al final de la solicitud, me sale una excepción (el navegador vuelve fina):
[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
No estoy del todo seguro Estoy usando esta biblioteca correctamente, así que podría estar haciendo algo descaradamente mal. El flujo básico de mi código es:
- petición llega
- Crear conexión con RabbitMQ usando TornadoConnection; especifique una devolución de llamada
- En la devolución de llamada de conexión, cree un canal, declare/enlace mi cola, y llame a basic_consume; especifique una devolución de llamada
- En la devolución de llamada de consumo, cierre el canal y llame a la función de finalización de Tornado.
- Ver excepción.
Mis preguntas son algunas de ellas:
- Es este flujo uniforme correcto? No estoy seguro de cuál es el propósito de la devolución de llamada de conexión, excepto que no funciona si no lo uso.
- ¿Debo crear una conexión AMQP por solicitud web? La documentación de RabbitMQ sugiere que no, no debería, pero preferiría seguir creando canales. Pero, ¿dónde crearía la conexión y cómo intentaré reconectarla si se cortara brevemente?
- Si estoy creando una conexión AMQP por solicitud web, ¿dónde debería estar cerrando? Llamar a amqp.close() en mi devolución de llamada parece arruinar las cosas aún más.
Voy a tratar de tener un código de muestra un poco más tarde, pero los pasos que describí anteriormente muestran el lado consumidor de las cosas bastante completamente. También estoy teniendo problemas con la publicación, pero el consumo de colas es más apremiante.
al ver el código en sí es mucho mejor que la lectura una explicación verbal de eso. –