之前查资料做的记录,放上来,兴许某天用的着
JMX发现和查找服务
一个JMX AGENT 通常包括了一个mbean server和若干个协议连接器和适配器,也称作连接服务器,因为这些东西负责为远程客户端提供获取和操作mbean server中的mbean的接口。但是,如果一个MBeanserver的MBean数量非常多的话,查找起来也是非常麻烦的。因此,JMX MBeanserver提供了一系列的接口和类,用于描述你的查找语句(有点类似sql),简化你的查找过程
主要的方法有两个:queryMBeans(ObjectName, QueryExp) 和 queryNames(ObjectName, QueryExp)。一个用于查找特定的MBean,另一个则是查找符合要求的MBean的ObjectName集合。两者用法一样,主要解释一下参数的含义。
ObjectName:定义查找的范围,相当于“预查找”。
构造此ObjectName参数时所用的字符串可以是简单的正则表达式,也就是类似 new ObjectName(“HelloAgent:type=a,*”),意思是“以HelloAgent为前缀,且至少包含一个值为a的属性type”。“*”即表示“零个或多个字符”,除了“*”外,还能用“?”表示“单个字符”,用法和我们平常的正则表达式一样。本参数的目的就是缩小查找范围。
QueryExp:查询表达式。
在刚才的ObjectName限定了范围后,就可以进一步用这个QueryExp来细化查找了。为了能表达更加丰富的查找语义,JMX总共提供了四个类用于构造查询表达式,它们是:
■ QueryExp
■ ValueExp
■ AttributeValueExp
■ StringValueExp
具体含义先不解释,看了后面的实例就能明白了。JMX还有一个专门的工具类Query,它包含了很多静态方法,用于产生上面这四个类。先看看下面这行代码。
QueryExp exp = Query.gt( Query.attr( "count" ), Query.value( 10 ) );
“gt”指“大于”,这行代码的意思是:“查找拥有属性值count并且大于10的MBean”。
换个复杂的例子:
QueryExp exp1 = Query.equals( Query.attr( "inkLevel" ),Query.value( "LOW" ) );
QueryExp exp2 = Query.equals( Query.attr( "paperCount" ),Query.value( "LOW" ) );
QueryExp finalExp = Query.or( exp1, exp2 );
mbeanServer.queryMBeans( new ObjectName( "Hardware:*" ), finalExp );
前两句意思差不多,第三句表示“exp1或exp2成立”,最后是执行查询。从这些例子可以看出,MBean的查询语句和编译原理、sql的内容差不多,也是计算机语言的共通之处,只是换成了以对象来表达而已。更多内容,请参考JMX手册