使用Stomp协议连接到ActiveMQ的Python程序保持断开连接

使用Stomp协议连接到ActiveMQ的Python程序保持断开连接,activemq,stomp,Activemq,Stomp,下面是python程序中连接到ActiveMQ的连接参数 broker\u url=config\u params.items('BROKERS')) conn=stomp.Connection12(代理url, 重新连接睡眠初始值=20.0, 重新连接睡眠增加=2.0, 重新连接尝试次数最多为10次, 心跳=(60000) ) 因此,连接的ReadCheckInterval和WriteCheckInterval设置为1分钟。看来心跳被错过了。我只是想弄清楚客户端或ActiveMQ服务器端是否

下面是python程序中连接到ActiveMQ的连接参数

broker\u url=config\u params.items('BROKERS'))
conn=stomp.Connection12(代理url,
重新连接睡眠初始值=20.0,
重新连接睡眠增加=2.0,
重新连接尝试次数最多为10次,
心跳=(60000)
)
因此,连接的
ReadCheckInterval
WriteCheckInterval
设置为1分钟。看来心跳被错过了。我只是想弄清楚客户端或ActiveMQ服务器端是否缺少心跳。有人能帮我吗

下面是Python程序的日志:

2020-02-25 12:27:16,141 - INFO - Attempting connection to host
2020-02-25 12:27:16,142 - INFO - Established connection to host
2020-02-25 12:27:16,142 - INFO - Starting receiver loop
2020-02-25 12:27:16,143 - DEBUG - Sending frame: ['STOMP', '\n', 'accept-version:1.2\n', 'client-id, 'heart-beat:60000,60000\n',]
2020-02-25 12:27:16,143 - DEBUG - Received frame: 'CONNECTED', headers={'server': 'ActiveMQ/5.15.2', 'heart-beat': '60000,60000']body=''
2020-02-25 12:27:16,143 - DEBUG - Sending frame: ['SUBSCRIBE', '\n', 'ack:auto\n', 'activemq.subscriptionName:subscriber\n']
2020-02-25 12:30:16,144 - DEBUG - Received frame: 'heartbeat', headers={}, body=None
2020-02-25 12:30:16,145 - ERROR - disconnected from broker, will attempt to reconnect...
2020-02-25 12:30:16,145 - INFO - Receiver loop ended
2020-02-25 12:30:16,320 - INFO - Attempting connection to host
2020-02-25 12:30:16,321 - INFO - Established connection to host
2020-02-25 12:30:16,321 - INFO - Starting receiver loop
2020-02-25 12:30:16,321 - DEBUG - Sending frame: ['STOMP', '\n', 'accept-version:1.2\n', 'client-id:\n', 'heart-beat:60000,60000\n']
2020-02-25 12:30:16,322 - DEBUG - Received frame: 'CONNECTED', headers={'server': 'ActiveMQ/5.15.2', 'heart-beat': '60000,60000']body=''
2020-02-25 12:30:16,322 - DEBUG - Sending frame: ['SUBSCRIBE', '\n', 'ack:auto\n', 'activemq.subscriptionName:subscriber]
我看到客户端和服务器都缺少相互发送心跳。下面是客户端未发送心跳信号的日志。连接在12:03:32建立。客户端在12:03:32发送第一次心跳,然后订阅ActiveMQ目标。它不断地收到信息,所以有活动,直到12:12:08。然后在12:13:32(>60秒)之前进行一段时间的不活动,连接被终止。这是否是ActiveMQ服务器对错过客户端心跳的容忍度太低的问题。在这种情况下,将客户端的心跳间隔增加到120秒是否有帮助

2020-02-26 12:03:32,498 - INFO - Established connection to host, port 61613
2020-02-26 12:03:32,499 - INFO - Sending frame: 'STOMP', headers={'heart-beat': '60000,60000'}
2020-02-26 12:03:32,512 - INFO - Received frame: 'CONNECTED', headers={'heart-beat': '60000,60000'}
2020-02-26 12:03:32,513 - INFO - Sending frame: 'SUBSCRIBE'
2020-02-26 12:04:27,924 - INFO - Received frame: 'MESSAGE'
.
.
2020-02-26 12:12:08,475 - INFO - Received frame: 'MESSAGE'
2020-02-26 12:13:32,519 - INFO - Received frame: 'heartbeat'
2020-02-26 12:13:32,548 - ERROR - disconnected from broker

我还看到服务器无法发送心跳信号,客户端出现心跳超时错误。我正在考虑通过将heartbeat配置设置为(120000,0),从服务器上禁用heartbeat。有什么建议吗?

Connect hear beat头中的第一个值是客户心跳发送给代理的“will send”值。客户应尝试在指定的水平上保持一致的心跳,该水平定义为

心跳间隔的最小毫秒数 保证


代理将根据该值允许一定的宽限期,在此宽限期后,如果客户端未发送心跳或任何其他帧,则连接将关闭。从给定的跟踪中,客户端没有发送任何心跳或其他有线级别的活动,因此代理正在断开连接

经过一些测试,结果表明,即使客户端心跳延迟几毫秒,也会导致代理关闭连接

出于同样的原因,从ActiveMQ服务器版本5.9.0, 已添加transport.hbg(默认值=1)。这将使心跳超时增加设定值的一倍。下面是用于实现此功能的JIRA链接


我还删除了代理心跳,将心跳设置为(60000,0),因为它是冗余的。

您所说的
ReadCheckInterval
WriteCheckInterval
是什么意思?您是在谈论心跳配置吗?您的客户端似乎没有发送任何心跳来保持连接。您是否有任何来自服务器的调试日志记录可以指示它是否正在接收心跳?谢谢Tim。我用一些额外的日志和观察编辑了我的问题。这是否是ActiveMQ服务器对错过客户端心跳的容忍度太低的问题。在这种情况下,将客户端的心跳间隔增加到120秒是否有帮助?我还看到服务器无法发送心跳信号,客户端出现心跳超时错误。我正在考虑通过将heartbeat配置设置为(120000,0),从服务器上禁用heartbeat。有什么建议吗?鉴于有限的上下文,我无法从日志中判断,代理代码已经测试了很多年,所以我要说你的客户机有问题。