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

问题描述 投票:0回答:2

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

broker_url = config_params.items('BROKERS')
conn = stomp.Connection12(broker_url, 
                          reconnect_sleep_initial=20.0, 
                          reconnect_sleep_increase=2.0, 
                          reconnect_attempts_max=10, 
                          heartbeats=(60000,60000)
                          )

因此ReadCheckIntervalWriteCheckInterval设置为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

我还看到服务器缺少发送心跳的问题,并且客户端出现心跳超时错误。我正在考虑通过将心跳配置设置为(120000,0)来禁用服务器的心跳。有什么建议吗?

activemq stomp
2个回答
0
投票

[Connect listen-beat]头中的第一个值是客户端心跳到代理的“将发送”值。服务对象应尝试在指示的水平上保持稳定的心跳,该水平定义为

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

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


0
投票

经过一些测试,结果表明客户端心跳中甚至几毫秒的延迟都导致代理关闭连接。

出于同样的原因,从ActiveMQ服务器5.9.0版开始,添加了transport.hbGracePeriodMultiplier(默认= 1)。这会使心跳超时增加设置值的一倍。以下是用于实现此功能的JIRA链接。

https://issues.apache.org/jira/browse/AMQ-4674

我还通过将冗余信号设置为(60000,0)来删除了代理波动信号,]。>

© www.soinside.com 2019 - 2024. All rights reserved.