Java Management Extensions管理擴展原理解析
所謂JMX,是Java Management Extensions(Java管理擴展)的縮寫,是一個為應(yīng)用程序植入管理功能的框架。用戶可以在任何Java應(yīng)用程序中使用這些代理和服務(wù)實現(xiàn)管理。
一、JMX架構(gòu)圖

從圖中我們可以看到,JMX的結(jié)構(gòu)一共分為三層:
1、 基礎(chǔ)層:主要是Mbean,被管理的java bean
Mbean分為如下四中
| 類型 | 描述 |
|---|---|
| standard MBean | 這種類型的MBean最簡單,它能管理的資源(包括屬性,方法,時間)必須定義在接口中,然后MBean必須實現(xiàn)這個接口。它的命名也必須遵循一定的規(guī)范,例如我們的MBean為Hello,則接口必須為HelloMBean。 |
| dynamic MBean | 必須實現(xiàn)javax.management.DynamicMBean接口,所有的屬性,方法都在運行時定義 |
| model MBean | 與標準和動態(tài)MBean相比,你可以不用寫MBean類,只需使用javax.management.modelmbean.RequiredModelMBean即可。RequiredModelMBean實現(xiàn)了ModelMBean接口,而ModelMBean擴展了DynamicMBean接口,因此與DynamicMBean相似,Model MBean的管理資源也是在運行時定義的。與DynamicMBean不同的是,DynamicMBean管理的資源一般定義在DynamicMBean中(運行時才決定管理那些資源),而model MBean管理的資源并不在MBean中,而是在外部(通常是一個類),只有在運行時,才通過set方法將其加入到model MBean中。 |
2、適配層:MbeanServer,提供對資源的注冊和管理
3、接入層: 提供遠程訪問的入口
二、standard MBean演示
1、根據(jù)standard MBean的要求,我們首先要定義一個MBean接口,接口的命名規(guī)范以具體的實現(xiàn)類為前綴,為了后續(xù)可以注冊到
MBean Server中
package jmx;
public interface HelloMBean
{
public String getName();
public void setName(String name);
public String getAge();
public void setAge(String age);
public void helloWorld();
public void helloWorld(String str);
public void getTelephone();
}
2、定義一個實現(xiàn)類
package jmx;
/*
* 該類名稱必須與實現(xiàn)的接口的前綴保持一致(即MBean前面的名稱
*/
public class Hello implements HelloMBean
{
private String name;
private String age;
public void getTelephone()
{
System.out.println("get Telephone");
}
public void helloWorld()
{
System.out.println("hello world");
}
public void helloWorld(String str)
{
System.out.println("helloWorld:" + str);
}
public String getName()
{
System.out.println("get name 123");
return name;
}
public void setName(String name)
{
System.out.println("set name 123");
this.name = name;
}
public String getAge()
{
System.out.println("get age 123");
return age;
}
public void setAge(String age)
{
System.out.println("set age 123");
this.age = age;
}
}
3、定義agent層
package jmx;
import java.lang.management.ManagementFactory;
import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;
public class HelloAgent
{
public static void main(String[] args) throws JMException, Exception
{
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName helloName = new ObjectName("jmxBean:name=hello");
//create mbean and register mbean
server.registerMBean(new Hello(), helloName);
Thread.sleep(60*60*1000);
}
}
1、 通過工廠類獲取Mbean Server,用來做Mbean的容器
2、 ObjectName的取名規(guī)范:域名:name=Mbean名稱,其中域名和Mbean的名稱可以任取。這樣定義后,我們可以唯一標示我們定義的這個Mbean的實現(xiàn)類了
3、最后將Hello這個類注冊到MbeanServer中,注入需要創(chuàng)建一個ObjectName類,我們可以用jdk自帶的Jconsole用來觀察,可以設(shè)置屬性值和調(diào)用相關(guān)方法。
三、Notification
MBean之間的通信是必不可少的,Notification起到了在MBean之間溝通橋梁的作用。JMX 的通知由四部分組成:
1、Notification這個相當于一個信息包,封裝了需要傳遞的信息
2、Notification broadcaster這個相當于一個廣播器,把消息廣播出。
3、Notification listener 這是一個監(jiān)聽器,用于監(jiān)聽廣播出來的通知信息。
4、Notification filiter 這個一個過濾器,過濾掉不需要的通知。這個一般很少使用。保留Hello及HelloMBean,增加如下
package jmx;
public interface JackMBean
{
public void hi();
}
package jmx;
import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;
public class Jack extends NotificationBroadcasterSupport implements JackMBean
{
private int seq = 0;
public void hi()
{
//創(chuàng)建一個信息包
Notification notify =
//通知名稱;誰發(fā)起的通知;序列號;發(fā)起通知時間;發(fā)送的消息
new Notification("jack.hi",this,++seq,System.currentTimeMillis(),"jack");
sendNotification(notify);
}
}
這里的類Jack不僅實現(xiàn)了MBean接口,還繼承了NotificationBroadcasterSupport。jack在這里創(chuàng)建并發(fā)送了一個消息包。
package jmx;
import javax.management.Notification;
import javax.management.NotificationListener;
public class HelloListener implements NotificationListener
{
public void handleNotification(Notification notification, Object handback)
{
if(handback instanceof Hello)
{
Hello hello = (Hello)handback;
hello.printHello(notification.getMessage());
}
}
}
對HelloAgent做以下修改
package jmx;
import java.lang.management.ManagementFactory;
import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;
public class HelloAgent
{
public static void main(String[] args) throws JMException, Exception
{
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName helloName = new ObjectName("yunge:name=Hello");
Hello hello=new Hello();
server.registerMBean(hello, helloName);
Jack jack = new Jack();
server.registerMBean(jack, new ObjectName("jack:name=Jack"));
jack.addNotificationListener(new HelloListener(), null, hello);
Thread.sleep(500000);
}
}
我們利用jconsole調(diào)用jack的hi方法,這里當jack發(fā)出消息后,Notification被廣播至所有的MBean,當有MBean屬于Hello類時則調(diào)用Hello的printHello()方法。
四、JMX的應(yīng)用
在linux下利用jmx監(jiān)控Tomcat,在catlina.sh中進行一些環(huán)境變零的配置
| 配置 | 功能 |
|---|---|
| Dcom.sun.management.jmxremote=true | 相關(guān) JMX 代理偵聽開關(guān) |
| Djava.rmi.server.hostname | 服務(wù)器端的IP |
| Dcom.sun.management.jmxremote.port=29094 | 相關(guān) JMX 代理偵聽請求的端口 |
| Dcom.sun.management.jmxremote.ssl=false | 指定是否使用 SSL 通訊 |
| Dcom.sun.management.jmxremote.authenticate=false | 指定是否需要密碼驗證 |

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java與Oracle實現(xiàn)事務(wù)(JDBC事務(wù))實例詳解
這篇文章主要介紹了Java與Oracle實現(xiàn)事務(wù)(JDBC事務(wù))實例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
詳解SpringBoot開發(fā)使用@ImportResource注解影響攔截器
這篇文章主要介紹了詳解SpringBoot開發(fā)使用@ImportResource注解影響攔截器,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11
java使用RSA加密方式實現(xiàn)數(shù)據(jù)加密解密的代碼
這篇文章給大家分享java使用RSA加密方式實現(xiàn)數(shù)據(jù)加密解密,通過實例代碼文字相結(jié)合給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下2019-11-11
java httpclient設(shè)置超時時間和代理的方法
這篇文章主要介紹了java httpclient設(shè)置超時時間和代理的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02
Retrofit+Rxjava實現(xiàn)文件上傳和下載功能
這篇文章主要介紹了Retrofit+Rxjava實現(xiàn)文件上傳和下載功能,文中提到了單文件上傳和多文件上傳及相關(guān)參數(shù)的請求,需要的朋友參考下吧2017-11-11

