rabbitmq - 网络故障后进程保留在 RabbitMQ 服务器消费者列表中
问题描述
我正在尝试模拟连接到消息队列的场景,然后在网络故障(在我的情况下与 VPN 断开连接)之后,我的进程尝试在无限循环中重新连接到消息队列。
这是我的代码,似乎正在按照我的意图工作,但问题是,在与 VPN 断开连接后,此过程仍保留在“my_queue”上的消费者列表中,并且在重新连接到 VPN 时,会创建一个新的消费者,因此他们会堆积向上。我怎样才能防止这种情况发生?
import pika
import time
def callback(ch, method, properties, body):
print("Message received.")
while True:
try:
cred = pika.PlainCredentials('my_user', 'my_pass')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.10.171', port=5672, virtual_host='/', credentials=cred, heartbeat_interval=20, socket_timeout=1))
channel = connection.channel()
channel.queue_declare(queue='my_queue', durable=True)
channel.basic_consume(callback, queue='my_queue', no_ack=True)
print('Connected.')
channel.start_consuming()
except:
print('Lost connection.')
time.sleep(2)
解决方案
问题是服务器上的心跳间隔设置为零,因此未检测到不活动的消费者。我使用的是鼠兔 0.11.0 版。这似乎从服务器端提出了心跳建议。
推荐阅读
- c - 前身##运算符和变量
- apache-spark - Hadoop——存储集群的主节点磁盘部分突然。如何删除它?
- vb.net - 如何使用 VB.Net 在 Access 数据库中创建以自动编号开头的行条目?
- algorithm - 如何从表格的行数和列数中查找单元格数?
- automation - 如何强制作曲家自动忽略警告?
- python - 如何在没有 pip 的情况下安装 python 模块?
- python - 之后提取文本
BeautifulSoup 中的标记 - sql - 基于表中出现次数的后缀字段值
- java - Invokespecial 验证错误:类型不可分配
- html - 如何在复杂的html中使用CSS选择器选择特定类型的第一个后代