关键:pika.connection:关闭时尝试发送帧

时间:2014-05-19 05:32:30

标签: python websocket rabbitmq tornado pika

我使用Pika在Tornado和RabbitMQ中集成了Websocket。它成功地运行在各种队列上直到一段时间。然后引发以下错误:

CRITICAL:pika.connection:关闭时尝试发送帧

我已从https://github.com/haridas/RabbitChat/blob/master/tornado_webapp/rabbit_chat.py

获取代码参考

我彻底完成了我的代码,但却无法理解为什么会引发这样的错误。 有人可以帮忙解决问题!

谢谢!

另请注意,更改背压倍增器并不能解决问题。所以寻找一个真正的解决方案。

2 个答案:

答案 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由于共享队列上的多个异步线程系统而被扼杀。

因此,如果其他人面临同样的问题,请按照代码中的几项检查进行操作:

  1. 你有几个连接?有多少频道?有多少队列?有多少生产者 - 消费者? (这些可以通过sudo rabbitmqctl list_queues等确定)

  2. 了解所使用的结构后,跟踪正在运行的事务。对于多个用户的几个请求。

  3. 因此,在每个事务中,打印线程操作,以便您了解鼠兔活动。由于这些线程在异步中运行,如果错误地被淹没,会导致pika客户端崩溃。因此,创建一个线程管理器来控制线程。

  4. Gavin Roy& amp;来自Pika& amp;的Michael Klishin RabbitMQ分别。