当前位置: 代码迷 >> 应用服务器 >> JDK5跟JDK6对JMX的ObjectName模式支持的不同(监控应用服务器系列文章六)
  详细解决方案

JDK5跟JDK6对JMX的ObjectName模式支持的不同(监控应用服务器系列文章六)

热度:4462   发布时间:2013-02-26 00:00:00.0
JDK5和JDK6对JMX的ObjectName模式支持的不同(监控应用服务器系列文章六)

前言:去年上半年做了一个监控应用服务器的项目,然后开发过程中断断续续将自己的经验总结出来发表了几篇博文,并留下了QQ,之后这段时间,已经有不少朋友来咨询关于相关的问题,而其中有很多问题是共通的,所以时隔一年准备把冷饭拿出来再炒炒,针对这些共通的问题,再分享一些自己的心得和体会,希望对您有所帮助。

?

?

前提

?

需要监控多个Tomcat,而其中有些Tomcat使用JDK5,有些Tomcat使用JDK6,这时就会遇到的一个问题,请看下文。

?

?

现象

?

采集某个Web应用的所有的Servlet监控信息,使用如下的URL

http://localhost:58080/manager/jmxproxy?qry=*:j2eeType=Servlet,WebModule=/manager,*
?

?

从上面的URL可以看到,查询字符串为『*:j2eeType=Servlet,WebModule=*/manager,*

?

但是这样的查询字符串只对使用JDK6Tomcat有效,如果您监控的Tomcat使用JDK5,那么这个查询字符串会被认为是错误的,从而返回异常信息:

Error - javax.management.MalformedObjectNameException: Invalid character '*' in value part of property

?

?

分析

?

经验证,这是由于不同版本的JDKObjectName的支持不同,验证代码如下:

ObjectName objName = new ObjectName("*:j2eeType=Servlet,WebModule=*/manager,*");System.out.println(objName);

?

JDK6环境下运行这段代码没有问题,但是在JDK5环境下运行这段代码就会报异常:

Exception in thread "main" javax.management.MalformedObjectNameException: Invalid character '*' in value part of propertyat javax.management.ObjectName.construct(ObjectName.java:529)at javax.management.ObjectName.<init>(ObjectName.java:1304)at cn.chenfeng.Test.main(Test.java:10)

?

?

结论

?

JDK6的帮助文档中有这样一段:

ObjectName 模式的示例有:◆  *:type=Foo,name=Bar匹配键的具体设置为 type=Foo,name=Bar 的任何域中的名称。◆  d:type=Foo,name=Bar,*匹配具有键 type=Foo,name=Bar 以及 0 或其他键的域 d 中的名称。◆  *:type=Foo,name=Bar,*匹配具有键 type=Foo,name=Bar 以及 0 或其他键的域中的名称。◆  d:type=F?o,name=Bar将与诸如 d:type=Foo,name=Bar 和 d:type=Fro,name=Bar 之类的键和名称匹配。◆  d:type=F*o,name=Bar将与诸如 d:type=Fo,name=Bar 和 d:type=Frodo,name=Bar 之类的键和名称匹配。◆  d:type=Foo,name="B*"将与诸如 d:type=Foo,name="Bling" 之类的键和名称匹配。通配符在引号中也能被识别,并且像其他特殊字符一样可以使用 \ 转义。

?

可见JDK6是支持字符串中有???和?*?的匹配模式的,而JDK5却不支持,这点一定要注意!如果遇到这种错误,就得针对两种情况使用不同的应对措施了。

?

?