在 stomp.py 中实施心跳

Implementing heartbeat in stomp.py

我在我们的 stomp.py 7.0 客户端(仅限侦听器)中看到一些行为,在空闲时间未接收消息后,ActiveMQ 5.15.9 代理似乎放弃了客户端(即查看 ActiveMQ 管理控制台显示零消费者)。奇怪的是客户端的 on_disconnected 处理程序从未被调用,我们对客户端服务进行了健康检查以检查连接 is_connected(),但它仍然 returns 为真。

根据我的 understanding/research(如果有任何错误,请更正)这是由于代理试图 clean-up 它认为不活动的资源。同样根据我的研究,“心跳”可以用来避免对经纪人的这种看法。

我知道如何从客户端发送心跳 header 以及如何在 on_connected 中检查 server/broker 的响应(就其预期而言)但是我的问题是如何将客户端的实际心跳发送到 server/broker?我需要在我正在收听的 queue 上发送消息吗?如果是这样,我如何发送“心跳消息”而不必在我的听众中调整消息处理代码?我发送时不带 body 吗?还需要将代理配置为接受心跳吗?如果未配置,从客户端声明和发送它们仍然会导致代理断开客户端连接吗?

Heart-beating 是 STOMP 1.2 的一部分,因此只要您的客户端支持 STOMP 1.2,您就应该能够在建立连接时配置 heart-beating。此外,如果您的经纪人支持 STOMP 1.2,它应该接受 heart-beat header 并相应地调整其行为。您不必发送自己的 heart-beats。在没有任何“正常”STOMP 帧的情况下,客户端本身应该按照规范中的描述发送 EOL。

如果您的客户端不支持 STOMP 1.2,那么您应该升级到支持的客户端。 STOMP 1.2 规范于 2012 年 10 月发布,距今已有将近十年,因此我们有足够的时间来实施支持。