使用JMX管理Spring Bean
学习内容
将Spring bean暴露为MBean
远程管理Spring Bean
处理JMX通知
应用背景
Spring对DI的支持是通过在应用中配置Bean属性,这是一种非常不错的方法。不过,一旦应用已经部署并且正在运行,单独使用DI并不能帮助我们改变应用的配置。假设我们希望深入了解正在运行的应用并要在运行时改变应用的配置,此时,就可以使用java管理扩展(Java Manage-ment Extensions JMX)。
JMX这项技术能够让我们管理、监视和配置应用。
使用JMX管理应用的核心组件是托管bean(managed bean,MBean)。所谓的MBean就是暴露特定方法到JavaBean,这些方法定义了管理接口。JMX规范定义了如下4种类型的MBean:
标准MBean:标准MBean的管理接口是通过在固定的接口上执行反射确定的,bean类会实现这个接口;
动态MBean:动态MBean的管理接口是在运行时通过调用DynamicMBean接口的方法来确定的。因为管理接口不是通过静态接口定义的,因此可以在运行时改变;
开放MBean:开放MBean是一种特殊的动态MBean,其属性和方法只限定于原始类型、原始类型的包装类以及可以分解为原始类型或原始类型包装类的任意类型;
模型MBean:模型MBean也是一种特殊的动态MBean,用于充当管理接口与受管资源的中介。模型Bean并不像它们所声明的那样来编写。它们通常通过工厂生成,工厂会使用元信息来组装管理接口
Spring的JMX模块可以让我们将Spring bean导出为模型MBean,这样我们就可以查看应用程序的内部情况并且能够更改配置--甚至在应用的运行期。
将Spring bean导出为MBean
Spring的MBeanExporter是将Spring Bean转变为MBean的关键。MBeanExporter可以把一个或多个Spring bean导出为MBean服务器(MBean server)内的模型MBean。MBean服务器是MBean生存的容器。对MBean的访问,也是通过MBean服务器来实现的。
下面的@Bean方法在Spring中声明了一个MBeanExporter,他会将spittleController bean导出为一个模型MBean:
@Bean
public MBeanExporter mBeanExporter(SpittleController spittleController) {
MBeanExporter exporter = new MBeanExporter();
Map<String, Object> beans = new HashMap<String, Object>();
beans.put("spitter:name=Controller", spittleController);
exporter.setBeans(beans);
return exporter;
}
配置MBeanExporter的最简单方式是为他的beans属性配置一个Map集合,该集合中的元素是我们希望暴露为