【问题标题】:JMX Connection and Session handlingJMX 连接和会话处理
【发布时间】:2026-01-30 17:35:01
【问题描述】:

我目前正在构建一个基于 JMX 的监控设施。被监控的系统已经以发布/订阅的方式公开了一些KPI,即自定义编码的监控客户端可以连接到系统,激活和订阅这些KPI,然后系统会在有新的KPI值可用时立即通知客户端.由于这些 KPI 的评估可能在计算上很昂贵,因此仅评估那些至少具有一个订阅客户端的 KPI。

我现在的任务是扩展系统,提供基于 JMX 和 JMX 通知的监控服务器,以便任何 JMX 客户端都可以激活、订阅和接收这些 KPI。

我面临的问题是:每个连接的客户端都会更改服务器上的某些状态(即激活 KPI 并注册一些侦听器),一旦客户端的会话完成或由于连接丢失而失败,我需要立即清理这些状态。

关于第 13.1 章中JMX specification 声明的会话:

一个会话在客户端有状态,特别是它的监听器(见第 13.4 节“添加 远程侦听器”(第 208 页)。会话不一定有状态 服务器,对于本规范定义的两个连接器,它没有。

有谁知道允许维护某些会话状态的 JMXConnectorServer 实现?任何实现这种服务器的代码示例、教程或指导也将受到高度赞赏。

【问题讨论】:

  • 可能不再相关,但您可以让订阅超时吗?假设某种最短刷新时间并派生一个线程,该线程遍历您的订阅并删除它们太旧。

标签: java monitoring jmx


【解决方案1】:

也许您可以拥有类似 clientId 的东西,当您注册侦听器时,您将 clientId 作为参数,因此服务器会有一些客户端信息。

当客户端轻轻关闭时,可以向JMX服务器调用一个方法来清除监听,或者如果客户端失去连接无法轻轻关闭,可以在客户端有一个监控线程它注册谁正在侦听和关闭,并在必要时通知 JMX 服务器。

【讨论】: