在看系统源码的时候发现运用了JMX这个技术,于是去网上找了一些资料,看了很久没有清晰的认识,只是初探。作为一个技术备忘记录一下,以便以后能在工作中运用起来。
因为没有理解JMX的实际运用,这里不作过多解释。不过联想到之前做的一个数据字典热更新的需求,了解到的方案有两个,1:通过ZK监控来通知系统进行配置更新,不过这个有点邪门的感觉。2:通过shell脚本启动可执行架包发送socket请求,系统监听请求进行配置更新。了解到JMX后觉得也可以用JMX来做。
写了一个JMX小例子,大家可以作为参考。
/**
* 这接口命名有严格规范 ****MBean
*/
public interface HelloWorldMBean
{
public String getName();
public void setName(String name);
public void printSun();
public void printSun(String whoName);
}
被管理的bean要实现以上接口,不然会报NotCompliantMBeanException
public class HelloWorld implements HelloWorldMBean
{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printSun() {
System.out.println("Sun " + name);
}
public void printSun(String whoName) {
System.out.println("Sun " + whoName);
}
}
然后写一个管理页面的类
public class HelloWorldAgent
{
public static void main(String[] args)
throws JMException, Exception
{
int rmiPort = 1099;
String jmxServerName = "TestJMXServer";
Registry registry = LocateRegistry.createRegistry(rmiPort);
MBeanServer mbs = MBeanServerFactory.createMBeanServer(jmxServerName);
// MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
HtmlAdaptorServer adapter = new HtmlAdaptorServer();
ObjectName adapterName;
adapterName = new ObjectName(jmxServerName + ":name=" + "htmladapter");
adapter.setPort(8082);
adapter.start();
mbs.registerMBean(adapter, adapterName);
ObjectName objName =
new ObjectName(jmxServerName + ":name=" + "HelloWorld");
mbs.registerMBean(new HelloWorld(), objName);
JMXServiceURL url =
new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:"
+ rmiPort + "/" + jmxServerName);
System.out.println("JMXServiceURL: " + url.toString());
JMXConnectorServer jmxConnServer =
JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
jmxConnServer.start();
}
}
这个类用到了HtmlAdaptorServer类,需要引用 jdmkrt.jar,大家可以去 http://www.mvnjar.com/ 去下载。
运行主类,然后访问 http://localhost:8082/,就可以看到如下界面。
可以看到我们管理的bean,HelloWord。点击进去就是这个bean的信息,包括属性与方法。我们可以对属性进行赋值也可以直接调用方法。
以下为演示结果:
以上就是JMX的基本例子。
看到一段文章引用过来解释一下JMX的作用:
JMX是一种JAVA的正式规范,它主要目的是让程序有被管理的功能。
那么怎么理解所谓的“被管理”呢?试想你开发了一个软件(如WEB网站),它是在24小时不简断运行的,那么你可能会想要“监控”这个软件的运行情况,比如收到了多少数据,有多少人登录等等。或者你又想“配置”这个软件,比如现在访问人数比较多,你想把数据连接池设置得大一些;每天的UV、PV是多少;又或者在业务高峰的期间,你想对接口进行限流,就必须去修改接口并发的配置值。
应用场景:中间件软件WebLogic的管理页面就是基于JMX开发的,而JBoss则整个系统都基于JMX构架。
对于一些参数的修改,网上有一段描述还是比较形象的:
1、程序初哥一般是写死在程序中,到要改变的时候就去修改代码,然后重新编译发布。
2、程序熟手则配置在文件中(JAVA一般都是properties文件),到要改变的时候只要修改配置文件,但还是必须重启系统,以便读取配置文件里最新的值。
3、程序好手则会写一段代码,把配置值缓存起来,系统在获取的时候,先看看配置文件有没有改动,如有改动则重新从配置里读取,否则从缓存里读取。
4、程序高手则懂得物为我所用,用JMX把需要配置的属性集中在一个类中,然后写一个MBean,再进行相关配置。另外JMX还提供了一个工具页,以方便我们对参数值进行修改。
让开发者和管理者可以获取程序运行的状态以及动态的修改程序的相关配置。