`
yunzhu
  • 浏览: 1140891 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
B2b19957-cda7-3a9e-83a0-418743feb0ca
监控应用服务器
浏览量:109062
2e8be8be-e51f-346c-bcdd-12623c9aa820
Web前端开发
浏览量:119232
Bfa5df64-a623-34b9-85b8-ef3ce2aed758
经典异常的解决
浏览量:203965
社区版块
存档分类
最新评论
阅读更多

前言:做了一个监控应用服务器的项目(支持Tocmat、WebSphere、WebLogic各版本), 过程也算是磕磕绊绊,由于网上缺少相关资料,或者深陷于知识的海洋难以寻觅到有效的资料,因而走过不少弯路,遇过不少困难。为了留下点印记,给后来人留下 点经验之谈,助之少走弯路,故将这些经验整理出来,与大家分享。水平有限,难免疏漏,还望指正。如有疑问,欢迎留言,或者加入Q群参与讨 论:35526521

 


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

现象
采集某个Web应用的所有的Servlet监控信息,使用如下的 URL :
----------------------------------------------------------------------------
http://localhost:58080/manager/jmxproxy?qry=*:j2eeType=Servlet,WebModule=/manager,*
----------------------------------------------------------------------------
从上面的URL可以看到,查询字符串为『 *:j2eeType=Servlet,WebModule=* / manager,* 』

但是这样的查询字符串只对使用JDK6环境的Tomcat有效,如果您监控的Tomcat使用JDK5的环境,那么这个查询字符串会被认为是错误的,从而返回异常信息:
----------------------------------------------------------------------------
Error - javax.management.MalformedObjectNameException: Invalid character '*' in value part of property
----------------------------------------------------------------------------
 
原因分析
经验证,这是由于不同版本的JDK 对 ObjectName 的支持不同,验证代码如下:
----------------------------------------------------------------------------

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 property
at 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 却不支持,这点一定要注意!

如果遇到这种错误,就得针对两种情况使用不同的应对措施了。

 

1
5
分享到:
评论
2 楼 yunzhu 2015-06-26  
yy8093 写道
好奇怪,怎么被踩了

是啊,不知道为什么被踩,其他人遇到同样的问题,尚未知道答案的时候看到这篇文章,应该是可以解答疑惑的。真不知道为什么被踩 
1 楼 yy8093 2015-06-24  
好奇怪,怎么被踩了

相关推荐

Global site tag (gtag.js) - Google Analytics