前言:做了一个监控应用服务器的项目(支持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 却不支持,这点一定要注意!
如果遇到这种错误,就得针对两种情况使用不同的应对措施了。
相关推荐
JAVA设计模式在JDK中的应用JAVA设计模式在JDK中的应用 各种设计模式在JDK当中使用的地方 方便分析源码
设计模式在JDK中的应用(结合JDK源码,分析JDK对设计模式的支持与应用)。课设内容包括: (a)用UML类图分析JDK所支持或应用的设计模式的结构,并与GOF的结构加以对比; (b)举例并演示相关类的应用; (c)至少5...
JDK中的设计模式应用实例
JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11...
jdk1.8英文版本和jdk1.6中文版本,这是关于开发时候查询相应类和方法使用的
最常用和实用的JDK内存和线程监控指令,堆栈监控指令及操作步骤
官网 jdk6,jdk7,jdk8,jdk9,jdk10 windox 32位、64位、linux 32位、64位 百度云。
windows64位jdk6、jdk7、jdk8安装包
JDK6u45JDK6u45JDK6u45JDK6u45JDK6u45JDK6u45JDK6u45JDK6u45JDK6u45
mac jdk6 java6支持最新macOs10.13.4版本及以下,亲测有效
不论什么Java应用服务器实质都是内置了某个版本的JDK. 因此掌握 JDK是学好Java的第一步.最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,...
jdk7 jdk8 jdk9 jdk10 jdk11 jdk12 jdk13 jdk14 (win-64位) 资源共享
JDK6 帮助文档 JDK6 帮助文档JDK6 帮助文档 JDK6 帮助文档
jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-...
mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk...
java jdk6下简单客户端连接服务器端实例
jdk6免安装下载 免费下载
Jenkins 支持jdk1.7+jdk1.8打包,包括兼容组件、maven包,JDK建议用:jdk-8u11-linux-x64、jdk-7u80-linux-x64。 安装前将plugins放到/root/.jenkins/路径下,再启动Jenkins,首次启动跳过安装插件步骤,直接进入...
linux版jdk6linux版jdk6linux版jdk6linux版jdk6linux版jdk6linux版jdk6linux版jdk6
JDK1.5(jdk-1_5_0-windows-i586) JDK 是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握...