繁体   English   中英

如何通过JMS执行JMX?

[英]How to do JMX over JMS?

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

我想做的是能够从JMS网络上的任何位置访问各个服务器上的远程JMX接口。 我将拥有完整的JMX访问权限,就像通过常规RMI界面进行访问一样。 这意味着每种动作。

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

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

计划B可能是使用apache骆驼RMI模块,但似乎如果选择了lingo,则即插即用的功能远不止于此。

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

另一方面,它确实提供了一些有趣的功能,例如发现,异步JMX调用和pub / sub多播样式的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或从中读取它们应该没有任何问题。

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

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

如果您有兴趣,我在这里发布了OpenDMK的项目。

我正在使用netty为Java代理实现基本的JMX客户端,它可选地支持异步JMX请求。 响应是通过注册的侦听器传递的,就像“反向” MBeanServerConnection。 如果这很有用,请在此处查找源。

Jolokia(http://www.jolokia.org/)也是一个很棒的项目,用于使用REST和JSON远程访问JMX。 它会自动为您完成。 并支持批处理操作。 我建议看一看。

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

从那时起,我将使用JMS来发现我感兴趣的服务器的URL,并使用纯JMX。 我没有看到通过JMS发送每个RMI调用的好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM