一直以来,经常看到JMX这个keyword,于是就想什么时候研究一下,看了半天的材料,看得云里雾里,大概的意思好像就是说,各式可以的系统
分布在任何地方,如何统一去管理,去监控,于是sun就引入了jmx的概念。
但是具体怎么,如何使用,心里不清楚,直接看jms spec很吃力,忽然之间想,可以先从现有的jmx 框架去一个个研究,或许就能慢慢理解他的含义。
首先选择Jolokia:
http://www.jolokia.org。
他们的官方描述是:
Jolokia is a JMX-HTTP bridge giving an alternative to JSR-160 connectors. It is an agent based approach with support for many platforms. In addition to basic JMX operations it enhances JMX remoting with unique features like bulk requests or fine grained security policies.
废话少说,先下载安装再说。
在jolokia的Artifact 里面有面向不同框架方面的相关产品,
我下载了jolokia.war 他应该表示j2ee 应用服务,将 war部署到tomcat后
访问http://127.0.0.1:8080/jolokia
发现输出为
{"timestamp":1298621555,"status":200,"request":{"type":"version"},"value":{"protocol":"4.1","agent":"0.83","info":{"product":"tomcat","vendor":"Apache","version":"6.0.18"}}}
这是一串json字符串,里面是jmx信息,其中有我放入的容器是tomcat以及它的版本。
我想 如果我将war放入weblogic 或者其他j2ee 容器,应该对象的输出会有相关的j2ee的信息。
Artifact里面还有osgi和jvm的,因为osgi不是很熟,暂时就不研究,那么在开始jvm对应的jar
研究jvm 首先要了解javaAgent 参数的含义,为此先补一下-javaAgent 参数的知识。
具体可以参考
http://i-giraffe.com/2010/12/javaagent-example/
这里简要概括一下这个参数的含义,javaAgent 在main方法执行之前,执行agent的代码;必须实现premain这个方法。
因为是在main之前执行,那么可以运用在不修改现有程序来增强或修改软件,或者热启动等等。
接下来我们再回到jolokia jvm版本
首先我们下载这个jolokia_jvm_agent.jar 改为agent.jar, 下面我们需要写一个java application;
代码如下
public class FirstThread extends Thread{//继承Thread重写run方法
@Override
public void run(){
for (int i = 0; i < 300000; i++) {
System.out.println(i);
try {
Thread.sleep(100);//停100毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//////////////////main
public class MyProgram{
public static void main(String[] args) {
FirstThread fThread=new FirstThread();
fThread.start();
for (int i = 0; i < 300; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
我们打包为demo.jar
在cmd 命令下执行 java -javaagent:agent.jar -jar demo.jar
执行后我们访问
http://127.0.0.1:8778/jolokia/
会出现json的jmx 信息
{"timestamp":1299226883,"status":200,"request":{"type":"version"},"value":{"protocol":"4.1","agent":"0.83","info":{}}}
这里需要注意两点
如果我访问
http://127.0.0.1:8778/jolokia 则会出现404
另外如果上面的线程循环很小,一会儿就结束了,那么这个时候再访问就会找不到服务器。
另外agent的端口和host都可以通过参数来设定,具体可以查看jolokia jvm 相关的网页。
到目前为止,jolokia for jvm也演示结束了。