jmx是什么?
jmx是java下的资源管理规范泛指的资源可以代表任何对象和事务如网络设备应用程序在这里我们特指javabean
jmx可以干什么?
通过jmx可以在程序运行期改变资源的配置和状态启动或者停止服务对应着javabean就是调用setter设置新的属性值调用bean上的方法完成某些功能比如关闭原来的数据库连接设置一个新的数据库url然后启动新的数据库连接这些都是运行期的操作不需要你停止服务器当然你完全可以自己编码自己实现对bean配置的管理事实上如果不使用jmx也可以达到配置的目的不过使用jmx后可以作的更专业点
jmx在使用上的结构是怎么样的?
jmx最新的规范是从使用上来说jmx分为两部分服务端和客户端被管理的资源注册到服务端服务端可以开放某些协议和接口客户端通过某种方式连接到服务端根据协议执行某些操作使得服务端更改资源的配置和状态
当然上面这种说法是很粗糙的具体的细节可以查看jmx规范
spring和jmx集成有什么作用?
spring的最主要功能是进行ioc装配而这个装配相对来说是静态的一旦程序启动就需要通过其他手段来更改bean的属性jmx就是运行时改变配置的一种方法
spring是怎么集成jmx的?
spring对jmx的集成体现在两个方面
一方面如果你处于编写客户端代码的情况spring提供了orgspringframeworkjmxaccess 包使得你可以很容易的同Server连接实现管理代码
另一方面spring提供了orgspringframeworkjmxexport 包使得你不用编写任何代码就可以将spring下管理的bean作为jmx资源注册到server中下面我们只讨论export
jmx中经常提到的MBean是什么?
MBean就是被jmx管理的资源一般有两种类型的MBean标准的和动态的
标准类型的MBean最简单它能管理的资源(包括属性方法时间)必须定义在接口中然后MBean必须实现这个接口它的命名也必须遵循一定的规范例如我们的MBean为Hello则接口必须为HelloMBean
动态MBean必须实现javaxmanagementDynamicMBean接口所有的属性方法都在运行时定义
Spring的export 支持那种类型的bean?我的javabean必须符合jmx规范么?
Spring支持把任何一种bean作为MBean如果这个javabean本身就是按照jmx规范设计的MBeanspring会简单的把他注册到jmx server中如果这个bean不是MBean那么spring会动态创建一个MBean(事实上是一个model MBean)再把原先的这个bean设置到这个新创建的MBeanjmx server通过这个MBean间接的管理对应的资源
如果不用spring我可以使用jmx么?
当然可以不过使用spring你可以简单的和现有系统集成你不需要编写一行代码就能将你的应用建立在jmx基础上
你说的都很好我也决定使用spring对jmx的集成了那么我怎么开始?
首先你要下载spring版本接着要找到jmx的某个实现如果你使用的是jdk那么你已经内置了jmx功能如果你使用的是更低的版本那么你需要下载一个jmx的实现一般有两个选择下载sun的参考实现或者找一个更专业的实现比如mxj
下面我以sun参考实现为例子
spring中怎么配置jmx export?
java代码:
<?xml version= encoding=UTF?>
<!DOCTYPE beans PUBLIC //SPRING//DTD BEAN//EN beansdtd>
<beans>
<bean id=jmxMBeanExport class=orgspringframeworkjmxexportMBeanExporter>
<property name=server>
<beanclass=javaxmanagementMBeanServerFactory factorymethod=createMBeanServer/>
</property>
<property name=beans>
<map>
<entry key=MyAgent:name=htmladapterport=>
<bean class=mHtmlAdaptorServer initmethod=start>
<property name=port>
<value></value>
</property>
</bean>
</entry>
</map>
</property>
</bean>
</beans>
将这个applicationContext启动起来然后在浏览器中打//localhost:/你应该能看到一个jmx的管理界面
配置文件中的HtmlAdaptorServer有双重身份首先他是一个MBean被jmx server管理其次他对外打开了一个接口可以通过他管理jmx我们称这种MBean为Protocol adapters 或者connectors
事实上HtmlAdaptorServer的是放在jmxtoolsjar中的你也可以在其他jmx实现上(比如mxj的Server)也使用这个Adaptor这就是使用jmx的优势有一个统一的管理平台可以使用任何一种和标准兼容的管理工具
我如何将自己的bean export出来?
很简单只需要多一行entry就可以了比如java代码:
<entry key=MyAgent:name=hello>
<ref bean=hello/>
</entry>
Spring怎么知道要把我的bean中的哪些属性和方法暴露出来?
Spring其实不知道如果你不作任何配置那么他会采用一种很极端的方式所有的getter/setter都作为jmx中的属性所有的public方法都作为jmx中的方法但是从Object下继承来的会被屏蔽所以你不会在jmx中看到toString这个方法
事实上spring是通过MBeanInfoAssembler来获取资源信息的默认情况下他用的是SimpleReflectiveMBeanInfoAssembler如果你有定制的要求那么可以用其他的MBeanInfoAssembler
我看到了orgspringframeworkjmxexportannotation这个好像是jdk annotations 用的我也必须使用jdk么?
orgspringframeworkjmxexportannotation下的这些类是确实配合annotation用的上面说过如果要定制暴露给jmx中的属性和方法那么需要使用其他的MBeanInfoAssembler其中一种方法是利用annotations不过如果你不用到annotation就不需要使用jdkannotations只是一个可选项
jmx和spring不能作什么?
即使你用了jmx和spring也有很多是他们不能完成的功能比如他们不能直接帮助你向老板要求加薪不能阻止某些国家对海峡的干涉更不能协助人类探索火星……
好了回到正题jmx和spring只是协助你完成某些功能而且这些功能相对来说还是很有限的首先jmx中可被管理的属性只能是一些简单类型比如数字或者字符其次jmx也不能自动帮你把修改后的属性保存起来所以如果你自己不写特定的代码下次程序启动后还是原始的配置不过不管怎么说有了spring和jmx毕竟生活更美好了些