运行在一个如 Java 这样的成熟平台上的好处之一是可用性,比如有监控这样的成熟特性。JRuby 核心团队成员 Ola Bini,发现这对监控 JRuby 应用的内存行为是有用的:
只需在 Java 6 上运行 JRuby,你就可免费获得它。本质上你可以把它连上任何 Java 进程。远程也可以。并且获取这类信息。你的 Ruby 能做这事吗?
他用来监控 JVM 进程的工具是JConsole,该工具从 Java 5 开始就自带了。现在有另一种访问 JMX 信息的方法了: Jeff Mesnil 的 jmx4r ,它允许从 JRuby 代码中访问 JMX MBeans。下面是一个简单的例子: require 'java'<br></br>require 'jmx4r'<br></br>memory = JMX::MBean.find_by_name "java.lang:type=Memory"<br></br>memory.verbose = true<br></br>memory.gc
这是用默认连接参数连接到 localhost 上 MBean 服务器,你还可以使用自定义的 JMX Service URL。Jmx4r 使用 RubyMetaprogramming技术从 JMX 客户端代码中删除了样板文件。这允许以 Ruby 的方式访问 JMX MBean 的操作和属性。
在例子中,memory.verbose 是一个属性,通常必须使用 verbose JMX 方法调用来设置。Jmx4r 在代表 memory MBean 的类中设置访问器(accessor)。关于该 MBean 的信息被获取,而且define_method被用来为每个属性创建必要的方法。
method_missing帮助支持操作,当方法调用没有找到对应的方法定义时,该方法被调用。例子中,memory.gc 是一个对 Memory Mebean 操作的调用,用来运行垃圾回收器(Garbage Collector)——但是该方法并没有在 memory 对象所属类中定义。取而代之,method_missing 方法被调用,确定是否有该方法名的操作,接着利用 JMX API 调用该操作。
像 jmx4r 这样的类库的最大优势是,可以与 JRuby 交互式 shell(如 jirb)一起工作。这就允许开发者或 JRuby savy admin 去访问一个(或多个)MBean 服务器,而保留该语言的所有强大能力。这对还没有自动化的批量工作处理是有用的。另一个来自 jmx4r 网站的例子如下:
logging = JMX::MBean.find_by_name "java.util.logging:type=Logging"<br></br>logging.logger_names.each do |logger_name|<br></br> logging.set_logger_level logger_name, "INFO"<br></br>end
该例查询所有 logger 并一举改变了它们的 log 级别。在一个图形化工具中,需要对每个 logger 点击数下才能达到同样效果。更不用说,一旦该代码被编写并证明可用,可以保存到脚本中并重复使用。另一个好处是 JRuby 进程通过联系其 MBean 服务器具有监控其自己 JVM 的能力。最近新增的特性是提供认证支持。下面是使用样例:
JMX::MBean.establish_connection :host => "localhost", <br></br> :username => "jeff", :password => "secret" <br></br>
查看英文原文: JMX the Ruby way with jmx4r
评论