【问题标题】:How can I get Pika to retry connecting to RabbitMQ if it fails the first time?如果第一次失败,如何让 Pika 重试连接到 RabbitMQ?
【发布时间】:2011-04-11 03:06:52
【问题描述】:

我正在尝试让使用 Pika 的程序在失败时不断重试连接到 RabbitMQ。根据我对 Pika 文档的了解,有一个 SimpleReconnectionStrategy 类可用于完成此任务,但似乎效果不佳。

strategy        = pika.SimpleReconnectionStrategy()
parameters      = pika.ConnectionParameters(server)

self.connection = pika.AsyncoreConnection(parameters, True, strategy)
self.channel    = self.connection.channel()

连接应该wait_for_open并设置重新连接策略。

但是,当我运行它时,我会抛出以下错误:

error: uncaptured python exception, closing channel <pika.asyncore_adapter.RabbitDispatcher at 0xb6ba040c> (<class 'socket.error'>:[Errno 111] Connection refused [/usr/lib/python2.7/asyncore.py|read|79] [/usr/lib/python2.7/asyncore.py|handle_read_event|435] [/usr/lib/python2.7/asyncore.py|handle_connect_event|443])
error: uncaptured python exception, closing channel <pika.asyncore_adapter.RabbitDispatcher at 0xb6ba060c> (<class 'socket.error'>:[Errno 111] Connection refused [/usr/lib/python2.7/asyncore.py|read|79] [/usr/lib/python2.7/asyncore.py|handle_read_event|435] [/usr/lib/python2.7/asyncore.py|handle_connect_event|443])

当 Pika 尝试连接时,会不断抛出这些错误。如果我在客户端运行时启动 RabbitMQ 服务器,它将连接。我只是不喜欢看到这些错误...它们正常吗?我做错了吗?

【问题讨论】:

    标签: python rabbitmq amqp


    【解决方案1】:
    import socket
    
    ...
    
    while True:
        connectSucceeded = False
        try:
            self.channel    = self.connection.channel()
            connectSucceeded = True
        except socket.error:
            pass
        if connectSucceeded:
            break
    

    通常使用类似上述的内容。您还可以在每次循环中添加time.sleep() 以减少尝试频率,因为有时服务器确实会关闭。在实际生产代码中,我还会计算重试次数(或跟踪重试所花费的时间)并在一段时间后放弃。有时最好记录错误和崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 2019-02-21
      • 2018-07-07
      • 1970-01-01
      • 2012-03-19
      相关资源
      最近更新 更多