【问题标题】:Implementing heartbeat in stomp.py在 stomp.py 中实现心跳
【发布时间】:2022-02-21 04:49:33
【问题描述】:

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

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

我知道如何从客户端发送心跳标头以及如何在on_connected 中检查来自服务器/代理的响应(就其预期而言),但我的问题是如何从客户端到服务器/代理?我需要在我正在收听的队列上发送消息吗?如果是这样,我如何发送“心跳消息”而不必调整侦听器中的消息处理代码?没有实体送吗?还需要将代理配置为接受心跳吗?如果未配置,则从客户端声明和发送它们仍会导致代理断开客户端?

【问题讨论】:

  • activemq 5.15.9 alpine,Stomp.py 7.0

标签: python activemq stomp stomp.py


【解决方案1】:

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

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

【讨论】:

  • 感谢您的快速回复。澄清一下,如果我想声明我的客户端将每 5 秒发送一次心跳并且不期望来自代理的任何内容,我似乎应该发送一个 heartbeats(5000, 0) 参数。如果我的客户端不执行任何阻塞操作,那么代理不应该清理任何资源,对吗?
  • 如果您在CONNECT 帧上将标头heart-beat:5000,0 发送给代理,那么代理将期望每5 秒进行一次 种通信。即使您的应用程序执行阻塞操作,底层 STOMP 客户端实现仍应发送适当的数据以保持连接处于活动状态。这就是首先使用心跳的全部意义所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 2010-11-19
  • 2017-07-12
  • 2017-06-18
相关资源
最近更新 更多