2

我需要增强分布式 Java 应用程序的 JMX 接口。选择 JMX 的原因是暴露数据的简单性。这些分布式应用程序存在于连接到 JMS 服务器 (activemq 5.7) 的几台不同的机器中(该服务器又连接到另一个 JMS 服务器以桥接 2 个网络,也是 activemq 5.7)。

我想做的是能够从 JMS 网络上的任何地方访问各个服务器上的远程 JMX 接口。我需要完整的 JMX 访问权限,就像通过通常的 RMI 接口访问一样。这意味着每一种行动。

我知道我可以使用lingo使远程 jmx 接口与 JMS 服务器通信,然后我的网桥应该允许我访问它们(假设其配置正确)。

这是一个好方法吗?有没有人为此尝试过术语?还有其他我可能没有找到的选择吗?

计划 B 可能是使用 apache camel RMI 模块,但似乎如果 lingo 是一种选择,它会比这更即插即用。

4

3 回答 3

3

我认为这不是一个坏方法。我能想到的使用 JMS 的一个缺点是对代理的依赖,这是大多数 JMS 实现所依赖的。

另一方面,它确实提供了一些有趣的功能,例如发现、异步 JMX 调用和发布/订阅多播样式的 JMX 操作,您可以在其中发出一个操作请求并从所有 MBeanServer 接收响应。

我不知道有任何实际的实现,但实现起来可能并不太难。您只需要在每个目标 JVM 上配置一个客户端即可:

  1. 侦听 JMX 请求:侦听器将解组请求(应该是MBeanServerConnection方法调用的编码)。对 pub/sub 样式调用使用公共主题,将编组的结果返回到请求消息中JMSReplyTo属性中指定的目的地。否则,您可以为每个 JVM 分配一个队列,或者为每个 JVM 选择一个唯一标识符并使​​用消息选择器。
  2. 如果要实现 JMX 通知,则需要实现一个代理NotificationListener,它注册所需的通知并在收到时将它们转发到指定的 JMS 目的地。

您还可以考虑实现一个完整的javax.management.remote实现,它可以通过标准的遵守更顺利地集成到您的环境中。

我发现OpenDMK项目对于扩展/实现 JMX 服务器和客户端非常有用。该库提供了使用“自定义”协议实现标准 JMX 远程解决方案的基本构建块。基本上,您实现一个javax.management.remote.generic.MessageConnection作为传输和调用机制。所有 JMX 调用、响应和回调都被序列化为javax.management.remote.message.Message的实例,并且它们都是可序列化的,因此将它们写入 JMS ObjectMessage 和从 JMS ObjectMessage读取它们应该没有任何问题。

您将从这种方法中获得的一些额外好处是:

  1. 如果您正确配置类路径,您应该能够使用任何标准 JMX 工具(例如 JConsole)连接到您的 JVM。
  2. OpenDMK 还提供了联合 MBeanServers 的能力,这使您的所有 MBeanServer 实例都出现,并且可以通过一个中央 MBeanServer 访问。此功能需要标准的 JMX 远程实现。
  3. OpenDMK 还实现了一个有趣的服务发现协议,它有几种不同的风格,包括原始多播和“phone-home”方法,可以很好地与您的 JMS 协议相结合。

如果您有兴趣,我在此处发布了 OpenDMK 的 mavenised 项目。

我正在使用 netty 为 java-agents 实现一个基本的 JMX 客户端,它可以选择支持异步 JMX 请求。响应通过注册的监听器传递,就像“反向”MBeanServerConnection。如果这有用,请在此处找到源代码。

于 2012-12-19T13:32:57.843 回答
2

Jolokia (http://www.jolokia.org/) 也是一个使用 REST 和 JSON 远程访问 JMX 的好项目。它会自动为您执行此操作。并且还支持批处理操作。我建议看看那个。

如果您使用 JMX 获取 AMQ 统计信息,那么它提供了一个插件,因此您可以只使用 JMS 消息而不是 JMX 来获取统计信息:http: //activemq.apache.org/statisticsplugin.html

于 2012-12-20T05:10:26.767 回答
0

我将使用 JMS 来发现我感兴趣的服务器的 URL,并从那时起使用普通的 JMX。我看不到通过 JMS 发送每个 RMI 调用的优势。

于 2012-12-19T11:05:11.573 回答