python - 如果第一次失败,如何让 Pika 重试连接到 RabbitMQ?

标签 python rabbitmq amqp

我正在尝试让我的程序(使用 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 服务器,它将连接。我只是不喜欢看到这些错误……它们正常吗?我做错了吗?

最佳答案

import socket

...

while True:
    connectSucceeded = False
    try:
        self.channel    = self.connection.channel()
        connectSucceeded = True
    except socket.error:
        pass
    if connectSucceeded:
        break

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

关于python - 如果第一次失败,如何让 Pika 重试连接到 RabbitMQ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5616408/

相关文章:

python - 如何在 Seaborn 中叠加两个图表?

python - 从可能不完整的候选列表构建 2D 网格

Python 找不到 "__main__"模块

authentication - MQTT Broker 基于 token 的身份验证

python - celery - errno 111 连接被拒绝

java - 在同一台机器上同时运行 ActiveMQ 和 RabbitMQ 时 AMQP 协议(protocol)版本不匹配

go - 如何验证发布者确认行为

python - 使用 PIP 安装 python 项目

java - 如何在繁重的生产者环境中限制收到的订阅数量

java - 需要添加/更新持久性rabbitmq队列的参数