我使用Pika在Tornado和RabbitMQ中集成了Websocket。它成功地运行在各种队列上直到一段时间。然后引发以下错误:
CRITICAL:pika.connection:关闭时尝试发送帧
我已从https://github.com/haridas/RabbitChat/blob/master/tornado_webapp/rabbit_chat.py
我彻底完成了我的代码,但却无法理解为什么会引发这样的错误。 有人可以帮忙解决问题!
谢谢!
另请注意,更改背压倍增器并不能解决问题。所以寻找一个真正的解决方案。
答案 0 :(得分:3)
有时候,由于网络中的昙花一现,pika连接才会终止。您应该向PikaClient
类添加代码,以便在连接断开时自动重新连接。像这样的东西(未经测试,但应该给你的想法):
def on_connection_closed(self, connection, reply_code, reply_text):
"""This method is invoked by pika when the connection to RabbitMQ is
closed unexpectedly. Since it is unexpected, we will reconnect to
RabbitMQ if it disconnects.
"""
self.channel = None
if self._closing: # Don't reconnect if you explicitly closed the connection.
pass
else:
logger.warning('Connection closed, reopening in 5 seconds: (%s) %s',
reply_code, reply_text)
self.connection.add_timeout(5, self.reconnect)
def reconnect(self):
"""Will be invoked by the IOLoop timer if the connection is
closed. See the on_connection_closed method.
"""
# Create a new connection
self._reconnecting = True
self.connection = self.connect()
答案 1 :(得分:1)
由于消费者和生产者正在排队 - 从特定队列中出队,因此PIKA Client由于共享队列上的多个异步线程系统而被扼杀。
因此,如果其他人面临同样的问题,请按照代码中的几项检查进行操作:
你有几个连接?有多少频道?有多少队列?有多少生产者 - 消费者? (这些可以通过sudo rabbitmqctl list_queues等确定)
了解所使用的结构后,跟踪正在运行的事务。对于多个用户的几个请求。
因此,在每个事务中,打印线程操作,以便您了解鼠兔活动。由于这些线程在异步中运行,如果错误地被淹没,会导致pika客户端崩溃。因此,创建一个线程管理器来控制线程。
Gavin Roy& amp;来自Pika& amp;的Michael Klishin RabbitMQ分别。