java - 如何处理JMX客户端轮询

  显示原文与译文双语对照的内容

最近我跳入了JMX世界,试图对我们的应用程序进行测试,并通过定制的JMXClient公开一些操作。 在不改变现有代码的情况下,确定如何对这些类进行测试的工作已经完成了。 我使用DynamicMBean实现实现了这个。 具体地说,我创建了一组注释,我们用这些注释来修饰类。 在创建对象时,我们通过一个类对它们进行 register 服务,这为类构建了一个 dynamicMBean,并注册了它。 当我们使用JConsole或者VisualVM时,这一切都很漂亮。 我们可以执行操作并查看字段的状态,就像我们应该能够。 我的问题更适合创建像JConsole这样的半实时 JMXClient 。

我所面临的最大问题是如何使JMXClient尽可以能接近实时报告字段状态,而无需修改通知库。 在某个类的setter方法中,设置字段,然后触发一个JMX通知) 。 我们希望这些类完全不知道它们正在被检测。 检查一个属性时,在检查一个属性时,屏幕底部有一个刷新属性值的刷新按钮。 它显示给你的值是在将该属性加载到视图时检索到的值,而不使用刷新按钮进行更改。 我希望这一切发生在自己的。

我编写了一个小的UI,它显示了关于连接状态的一些数据,以及一些被测试的类上的一些字段。 为了使这些值反映当前状态,我有一个线程在后台旋转。 每秒或者所以线程尝试获得我感兴趣的字段的当前值,因这里UI会被更新为一个结果。 我不太喜欢这个解决方案,因为编写更新底层模型的逻辑非常棘手。 而且,以不引起奇怪 Bug ( 使用 Swing )的方式更新UI更为棘手。

在应用程序端,我还可以编写一个JMXAgent的附加部分,用一个线程运行已经注册的DynamicMBeans列表,确定它的属性的值是否发生了变化,然后推送了一个 notification(s) 。 这将将通知逻辑移出已经检测的库,但仍然会对应用程序加载更多负载:( 。

我只是想知道你们中的任何一个,或者它的他的,可以指导我为JMXClient设计方法。

如果你们有任何建议。

时间: 作者:

如果你不想更改实体,那么某些事情将必须轮询它们。 你的JMXAgent 或者JMX客户端都必须经常请求 bean 。 尽管你在调用一堆获得的信息,但是我不认为这将是非常昂贵的。 当然你的JMXAgent 比JMX客户机轮询所有时间都要好。 但是如果客户端正在轮询所有 bean,那么成本可能是完全相同的。

如果对象可以调用代理以说他们已经更改或者支持某种 isDirty() 方法,则不需要执行轮询。

我们的系统中,我们有一个度量系统,其中使用。 每个类都增加了自己的度量,并且它是连接到persister中的指标。 你可以使用JMX请求度量值,或者将它们持久化到磁盘或者。 通过使用 Metric 类型,在执行计数的实体和需要访问所有度量值的实体之间分离。

通过转到已经注册的Metric 对象类型,你的GUI可以查询 MetricRegistrar,并通过 JMX 。HTML或者它的他任何方式显示。 所以实体只做 metric.increment() 或者 metric.set(...),当它需要值时,GUI就会查询指标。

希望这里有什么帮助。

作者:

本身不是解决方案,但是你可以使用 Spring Integration 简化你的轮询事件转换器JMXAgent实现。 它有一些叫做JMX属性轮询通道,似乎满足你的需要。 示例这里:

作者:

在这里高效意味着停留在包含你正在查看的bean的mbean服务器内。 你所需要的是一种转换 convert know不知道如何将通知发布到 mbean 。

在监视数值和字符串属性时,你可以在监视包中使用标准的mbean 。 用你实际想要监视的bean ( 包含你想要监视的bean ) 来实例化这些插件,然后适当地设置。 在不向目标添加代码的情况下,你可以做到这一点,因为监视包在JVM中是标准的。 监视器bean将监视你选择用于更改的对象,仅在观察到实际更改时发出更改通知。 使用setGranularityPeriod告诉监视器bean查看目标的频率。

一旦监控bean就绪,就只为在更改时创建的MonitorNotifications创建 register 。

...