這篇文章主要介紹“Java Management Extensions管理擴(kuò)展原理是什么”,在日常操作中,相信很多人在Java Management Extensions管理擴(kuò)展原理是什么問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java Management Extensions管理擴(kuò)展原理是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
裕安網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)從2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
Java是一門面向?qū)ο缶幊陶Z(yǔ)言,可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序。
所謂JMX,是Java Management Extensions(Java管理擴(kuò)展)的縮寫,是一個(gè)為應(yīng)用程序植入管理功能的框架。用戶可以在任何Java應(yīng)用程序中使用這些代理和服務(wù)實(shí)現(xiàn)管理。
一、JMX架構(gòu)圖
從圖中我們可以看到,JMX的結(jié)構(gòu)一共分為三層:
1、 基礎(chǔ)層:主要是Mbean,被管理的java bean
Mbean分為如下四中
類型 | 描述 |
---|---|
standard MBean | 這種類型的MBean最簡(jiǎn)單,它能管理的資源(包括屬性,方法,時(shí)間)必須定義在接口中,然后MBean必須實(shí)現(xiàn)這個(gè)接口。它的命名也必須遵循一定的規(guī)范,例如我們的MBean為Hello,則接口必須為HelloMBean。 |
dynamic MBean | 必須實(shí)現(xiàn)javax.management.DynamicMBean接口,所有的屬性,方法都在運(yùn)行時(shí)定義 |
model MBean | 與標(biāo)準(zhǔn)和動(dòng)態(tài)MBean相比,你可以不用寫MBean類,只需使用javax.management.modelmbean.RequiredModelMBean即可。RequiredModelMBean實(shí)現(xiàn)了ModelMBean接口,而ModelMBean擴(kuò)展了DynamicMBean接口,因此與DynamicMBean相似,Model MBean的管理資源也是在運(yùn)行時(shí)定義的。與DynamicMBean不同的是,DynamicMBean管理的資源一般定義在DynamicMBean中(運(yùn)行時(shí)才決定管理那些資源),而model MBean管理的資源并不在MBean中,而是在外部(通常是一個(gè)類),只有在運(yùn)行時(shí),才通過set方法將其加入到model MBean中。 |
2、適配層:MbeanServer,提供對(duì)資源的注冊(cè)和管理
3、接入層: 提供遠(yuǎn)程訪問的入口
二、standard MBean演示
1、根據(jù)standard MBean的要求,我們首先要定義一個(gè)MBean接口,接口的命名規(guī)范以具體的實(shí)現(xiàn)類為前綴,為了后續(xù)可以注冊(cè)到
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、定義一個(gè)實(shí)現(xiàn)類
package jmx; /* * 該類名稱必須與實(shí)現(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,用來(lái)做Mbean的容器
2、 ObjectName的取名規(guī)范:域名:name=Mbean名稱,其中域名和Mbean的名稱可以任取。這樣定義后,我們可以唯一標(biāo)示我們定義的這個(gè)Mbean的實(shí)現(xiàn)類了
3、最后將Hello這個(gè)類注冊(cè)到MbeanServer中,注入需要?jiǎng)?chuàng)建一個(gè)ObjectName類,我們可以用jdk自帶的Jconsole用來(lái)觀察,可以設(shè)置屬性值和調(diào)用相關(guān)方法。
三、Notification
MBean之間的通信是必不可少的,Notification起到了在MBean之間溝通橋梁的作用。JMX 的通知由四部分組成:
1、Notification這個(gè)相當(dāng)于一個(gè)信息包,封裝了需要傳遞的信息
2、Notification broadcaster這個(gè)相當(dāng)于一個(gè)廣播器,把消息廣播出。
3、Notification listener 這是一個(gè)監(jiān)聽器,用于監(jiān)聽廣播出來(lái)的通知信息。
4、Notification filiter 這個(gè)一個(gè)過濾器,過濾掉不需要的通知。這個(gè)一般很少使用。保留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)建一個(gè)信息包 Notification notify = //通知名稱;誰(shuí)發(fā)起的通知;序列號(hào);發(fā)起通知時(shí)間;發(fā)送的消息 new Notification("jack.hi",this,++seq,System.currentTimeMillis(),"jack"); sendNotification(notify); } }
這里的類Jack不僅實(shí)現(xiàn)了MBean接口,還繼承了NotificationBroadcasterSupport。jack在這里創(chuàng)建并發(fā)送了一個(gè)消息包。
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()); } } }
對(duì)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方法,這里當(dāng)jack發(fā)出消息后,Notification被廣播至所有的MBean,當(dāng)有MBean屬于Hello類時(shí)則調(diào)用Hello的printHello()方法。
四、JMX的應(yīng)用
在linux下利用jmx監(jiān)控Tomcat,在catlina.sh中進(jìn)行一些環(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 代理偵聽請(qǐng)求的端口 |
Dcom.sun.management.jmxremote.ssl=false | 指定是否使用 SSL 通訊 |
Dcom.sun.management.jmxremote.authenticate=false | 指定是否需要密碼驗(yàn)證 |
到此,關(guān)于“Java Management Extensions管理擴(kuò)展原理是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!