2014-01-15 88 views
1

最近我进入了JMX的世界,尝试对我们的应用程序进行测试,并通过定制的JMXClient公开一些操作。我们已经完成了确定如何对类进行测试而不必对现有代码进行太多改动的工作。我使用DynamicMBean实现完成了这个任务。具体来说,我创建了一组注释,我们用它来装饰我们的类。然后,当创建对象(或者如果它们被用作静态类时被初始化),我们通过一个静态类将它们注册到我们的MBeanServer中,该静态类为类创建一个dynamicMBean并注册它。当我们只使用JConsole或VisualVM时,这已经非常成功。我们可以执行操作并查看所有可能的字段状态。我的问题更倾向于创建像JConsole一样的半实时JMXClient。如何进行JMX客户端轮询

我在这里面临的最大问题是如何使JMXClient以接近实时的方式报告字段状态,因为我可以合理获取,而无需修改工具库来推送通知(例如,在setter某些类的方法,设置字段,然后发出JMX通知)。我们希望这些课程几乎完全不知道他们正在装备。如果在检查属性时检出JConsole,则屏幕底部会有一个刷新按钮,用于刷新属性值。它向您显示的值是在该属性加载到视图中时检索到的值,并且不会在不使用刷新按钮的情况下更改。我希望这个发生在自己身上。

我写了一个小的UI,它显示了一些关于连接状态的数据,以及一些仪器化类的一些字段。为了使这些值反映当前状态,我有一个线程在后台旋转。线程每隔一秒左右尝试获取我感兴趣的字段的当前值,然后UI将得到更新。我不太喜欢这个解决方案,因为编写更新底层模型的逻辑很棘手。甚至更难以更新用户界面的方式不会导致奇怪的错误(使用Swing)。

我也可以在应用程序端编写JMXAgent的附加部分,其中一个线程通过已注册的DynamicMBeans列表运行,确定它们的属性值是否发生更改,然后推送通知( S)。这会将通知逻辑从仪表库中移出,但仍然会给应用程序带来更多负担:(。

我只是想知道你们中的任何一个人是否已经处于JMX或其他位置,并且可以引导我的设计方法为JMXClient还是真的任何其他意见,可以使这个解决方案比我有更优雅的方向是正确的。

你们已经将不胜感激任何建议。

+0

仅供参考:如果您在jconsole中绘制数值,它会每两秒钟自动刷新一次。 – Gray

回答

1

如果你不想改变实体,那么有些事情将不得不轮询它们。无论是你的JMXAgent还是JMX客户端都必须经常请求这些bean。虽然自从你打电话给一堆获奖者,但是我不认为它会很昂贵,所以你无法绕过这个表现。当然,你的JMXAgent总是比JMX客户端轮询更好。但是,如果客户无论如何都在轮询所有的豆,那么成本可能完全相同。

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

在我们的系统中,我们有一个使用各种组件的度量系统。每个类都增加了它们自己的度量标准,并且这些度量标准被连接到了一个持久化程序中。您可以使用JMX请求度量值或将它们保存到磁盘或线路。通过使用Metric类型,那么在进行计数的实体和需要访问所有度量值的实体之间存在分离。

通过注册Metric对象类型模型,您的GUI可以查询MetricRegistrar所有指标并通过JMX,HTML或其他方式显示它们。因此,您的实体只需要执行metric.increment()metric.set(...),GUI将在每次需要该值时查询度量标准。

希望在这里有所帮助。

+0

我在这里抵制不可避免的:(你可以推荐一种设计方法,它很适合GUI应用程序的异步模型更新吗?我很擅长为小问题提供解决方案,但总体上对设计方法的判断很差... –

+0

我已经添加了一些更多的细节给我的答案@MarkW。 – Gray

+0

感谢您的输入,我将不得不更多地考虑这个度量对象类型模型(我相信它与我已经做的非常相似) 。因为我相信你对JMX代理和客户端轮询机制之间的资源需求大致相同,并且没有办法绕过它,所以我也会接受这个答案。 –

0

不是解决方案,但是你可以使用Spring集成来简化你的轮询事件翻译器JMXAgent实现,它有一个叫做JMX Attribute Polling Channel的东西,它似乎满足了y我们的需要。 example here

0

这里的高效率意味着呆在包含您正在查看的bean的mbean服务器中。你想要的是一种方式转换 mbeans不知道如何发出通知到mbeans

要观看数字和字符串属性,可以在监视器包中使用标准mbeans。将那些实例化为包含您实际想要观看的bean的mbean服务器,然后适当地设置属性。您可以在不向代码添加代码的情况下执行此操作,因为监视程序包在JVM中是标准的。监视器bean将监视您选择进行更改的对象,并且只有在观察到实际更改时才会发出更改通知。使用setGranularityPeriod来告诉监视器bean多久看一次目标。

监视器bean就位后,只需注册将在更改时创建的MonitorNotifications。