是否可以使用JMX在一个中央MBean服务器中注册或显示不同VM的MBean?

我正在寻找一种解决方案,从中央MBean Server中的不同Java VM注册MBean或整个MBean Server本身,这也应该在一个单独的VM中运行。 目标是只有一个中央MBean Server,它包含整个系统的所有MBean。 另外一个要求就是难度:-),“客户端”MBean服务器必须连接/注册到中央MBean服务器而不是其他方式。 中央MBean Server不需要任何“客户端”MBean服务器的知识来注册。

我只找到了JMX示例,其中“主”MBean服务器连接到“客户端”MBean服务器并且注册了他们注册的MBean但不是其他方式。 遗憾的是,用于注册自己的MBean的registerMBean()方法仅适用于本地MBean服务器,但不适用于MBeanServerConnection上的远程MBean服务器。 在那里,只能使用createMbean()方法,问题在于它在远程MBean Server中注册MBean,但是你必须在远程MBean Server中使用不同的对象,一个本地和另一个。 所以现在的问题是,当本地对象上的某些内容发生更改时,只有那里的更改,远程MBean Server中的已注册MBean不会获得这些更改(变量的新值…)。 到目前为止,我唯一的解决方案是创建一个循环来取消注册远程服务器中的MBean并创建它们,以获取对象的实际值。 这非常难看,也不太好。

我希望有人能给我一个提示,我怎么能以更好的方式做到这一点。

OpenDMK使用级联服务提供了完整的方法。 从文档:

级联服务使您可以直接通过主代理的MBean服务器访问子代理的MBean。 Java动态管理工具包(Java DMK)5.1中的级联服务已经过全面改进,允许它通过Java Management Extensions(JMX)Remote API定义的连接器协议进行操作。 旧版级联服务现已弃用。 出于向后兼容性的原因,第25章保留了传统级联服务的示例。 但是,在使用旧版Java DMK连接器时,应将新的CasdingServiceMBean与包装的旧连接器一起使用,而不是依赖于不推荐使用的旧级联代理API。

这个库中有一些有趣的部分内容可以归入JMX 2.0中的标准Java SE。 我认为,级联服务就是其中之一。 一旦你理解它是如何工作的,你可以得出结论,你可以自己实现它,尽管OpenDMK确实有几个棘手的角落案例。 我不确定该项目有多活跃,但软件似乎很稳定。

您可以在此处找到文档集。 另外,我在这里创建了一个包的mavenized项目构建。

//尼古拉斯