用Apache的commons-modeler來輔助開發JMX
一、前言
每一個MBean都要有一個介面,比如前面的Hello要有一個HelloMBean介面。要多維護一個介面,的確是件麻煩的事。 Apache的commons-modeler利用JMX中的動態MBean原理很好的解決了這一問題,commons-modeler使用得我們可以只寫Hello,而不用寫HelloMBean這個介面。不過這是有代價的,它要求我們寫一個mbean的xml描述檔案(唉,少了一件事,卻又多出另一件事來)。但commons-modeler還是有優點的,就是它讓mbean的裝配更加靈活,把多個mbean的裝配都集中在一個XML檔案裡來了。
開始例項之前,你需要先去apache網站下載commons-modeler,以及modeler的依賴專案commons-logging。下載網址為:http://jakarta.apache.org/site/downloads/downloads_commons.html,下載的檔案是ZIP壓縮包,解壓後找到commons-logging.jar和commons-modeler.jar。如果在DOS下用命令列開發,則把這兩個JAR包加入到classpath系統變數中。如果你用Eclipse開發,則把JAR包加入到專案屬性的Libratries(庫)引用中。
二、HelloWorld例項
我們以本系統的第一篇“1、JMX的Hello World”為例,來重新實現一次。
1、Hello.java的程式碼不變(注:為了在Eclipse上和原來的Hello檔案放在不同的地方,我把新Hello放到了mbean.modelbean包),如下:
package mbean.modelbean;
import mbean.standard.HelloMBean;
public class Hello implements HelloMBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printHello() {
System.out.println("Hello World, " + name);
}
public void printHello(String whoName) {
System.out.println("Hello , " + whoName);
}
}
2、MBean不用寫了,但需要寫一個XML描述檔案。檔名任取,這裡取名為:mbeans-descriptors
<?xml version="1.0"?>
<mbeans-descriptors>
<mbean name="Hello" description="the hello bean" domain="chengang" group="helloGroup" type="mbean.modelbean.Hello">
<attribute name="name" description="a name attribute" type="java.lang.String" writeable="true"/>
<operation name="printHello" description="a operation to print hello" impact="INFO" returnType="String"/>
</mbean>
</mbeans-descriptors>
這裡只對<mbean>標籤做一下說明:
* name mbean在xml中的唯一標識,不一定要和類同名
* description mbean的註釋說明資訊
* domain mbean所屬域
* group mbean所屬組
* type mbean的類全名(包名+類名)
* classname 指定實現代理功能的ModelMbean的全名,如果不指定則預設為BaseModelMBean
3、接下來改寫HelloAgent
package mbean.modelbean;
import java.io.InputStream;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.modelmbean.ModelMBean;
import org.apache.commons.modeler.ManagedBean;
import org.apache.commons.modeler.Registry;
import com.sun.jdmk.comm.HtmlAdaptorServer;
public class HelloAgent {
public static void main(String[] args) throws Exception {
//基於xml中的資訊構建一個Registry
Registry registry = Registry.getRegistry(null, null);
InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
registry.loadMetadata(stream);
stream.close();
//由Registry得到一個MBeanServer
MBeanServer server = registry.getMBeanServer();
//得到Hello在描述檔案中的資訊類,對應於xml檔案<mbean>標籤的name屬性。
ManagedBean managed = registry.findManagedBean("Hello");
//建立ObjectName
ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
//得到ModelMBean
ModelMBean hello = managed.createMBean(new Hello());
//註冊MBean
server.registerMBean(hello, helloName);
ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
HtmlAdaptorServer adapter = new HtmlAdaptorServer();
server.registerMBean(adapter, adapterName);
adapter.start();
System.out.println("start.....");
}
}
HelloAgent是效複雜的地方,我們來和以前的HelloAgent逐步比較一下,前後有什麼不同:
(1)首先,新的HelloAgent需要將xml資訊讀入到Registry物件中,這是舊HelloAgent所沒有的。
Registry registry = Registry.getRegistry(null, null);
InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
registry.loadMetadata(stream);
stream.close();
(2)接著建立MBeanServer的方式也不同了
現在:MBeanServer server = registry.getMBeanServer();
以前: MBeanServer server = MBeanServerFactory.createMBeanServer();
(3)Hello相應的ObjectName建立也略不相同。主要是域名在XML描述檔案裡設定好了。
現在:ManagedBean managed = registry.findManagedBean("Hello");
ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
以前:ObjectName helloName = new ObjectName("chengang:name=HelloWorld")
(4)得到MBean的方式也不同,這裡就是關鍵的不同點
現在:ModelMBean hello = managed.createMBean(new Hello());
以前:Hello hello = new Hello();
注意:為什麼現在要比以前多一個createMbean步驟呢,就是因為現在的寫法並沒有寫Mbean,所以需要動態才需要生成一個。而以前就直接把new Hello()註冊到mbean server就可以了,server會自動找到它的HelloMBean介面檔案。
也就上面四點區別,其他程式碼完全一樣。測試和檢視效果的方法和以前一樣,在此不累述了。
commons Modeler為Hello動態生成了一個MBean介面:BaseModelBean
參考資料
每一個MBean都要有一個介面,比如前面的Hello要有一個HelloMBean介面。要多維護一個介面,的確是件麻煩的事。 Apache的commons-modeler利用JMX中的動態MBean原理很好的解決了這一問題,commons-modeler使用得我們可以只寫Hello,而不用寫HelloMBean這個介面。不過這是有代價的,它要求我們寫一個mbean的xml描述檔案(唉,少了一件事,卻又多出另一件事來)。但commons-modeler還是有優點的,就是它讓mbean的裝配更加靈活,把多個mbean的裝配都集中在一個XML檔案裡來了。
開始例項之前,你需要先去apache網站下載commons-modeler,以及modeler的依賴專案commons-logging。下載網址為:http://jakarta.apache.org/site/downloads/downloads_commons.html,下載的檔案是ZIP壓縮包,解壓後找到commons-logging.jar和commons-modeler.jar。如果在DOS下用命令列開發,則把這兩個JAR包加入到classpath系統變數中。如果你用Eclipse開發,則把JAR包加入到專案屬性的Libratries(庫)引用中。
二、HelloWorld例項
我們以本系統的第一篇“1、JMX的Hello World”為例,來重新實現一次。
1、Hello.java的程式碼不變(注:為了在Eclipse上和原來的Hello檔案放在不同的地方,我把新Hello放到了mbean.modelbean包),如下:
package mbean.modelbean;
import mbean.standard.HelloMBean;
public class Hello implements HelloMBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printHello() {
System.out.println("Hello World, " + name);
}
public void printHello(String whoName) {
System.out.println("Hello , " + whoName);
}
}
2、MBean不用寫了,但需要寫一個XML描述檔案。檔名任取,這裡取名為:mbeans-descriptors
<?xml version="1.0"?>
<mbeans-descriptors>
<mbean name="Hello" description="the hello bean" domain="chengang" group="helloGroup" type="mbean.modelbean.Hello">
<attribute name="name" description="a name attribute" type="java.lang.String" writeable="true"/>
<operation name="printHello" description="a operation to print hello" impact="INFO" returnType="String"/>
</mbean>
</mbeans-descriptors>
這裡只對<mbean>標籤做一下說明:
* name mbean在xml中的唯一標識,不一定要和類同名
* description mbean的註釋說明資訊
* domain mbean所屬域
* group mbean所屬組
* type mbean的類全名(包名+類名)
* classname 指定實現代理功能的ModelMbean的全名,如果不指定則預設為BaseModelMBean
3、接下來改寫HelloAgent
package mbean.modelbean;
import java.io.InputStream;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.modelmbean.ModelMBean;
import org.apache.commons.modeler.ManagedBean;
import org.apache.commons.modeler.Registry;
import com.sun.jdmk.comm.HtmlAdaptorServer;
public class HelloAgent {
public static void main(String[] args) throws Exception {
//基於xml中的資訊構建一個Registry
Registry registry = Registry.getRegistry(null, null);
InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
registry.loadMetadata(stream);
stream.close();
//由Registry得到一個MBeanServer
MBeanServer server = registry.getMBeanServer();
//得到Hello在描述檔案中的資訊類,對應於xml檔案<mbean>標籤的name屬性。
ManagedBean managed = registry.findManagedBean("Hello");
//建立ObjectName
ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
//得到ModelMBean
ModelMBean hello = managed.createMBean(new Hello());
//註冊MBean
server.registerMBean(hello, helloName);
ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
HtmlAdaptorServer adapter = new HtmlAdaptorServer();
server.registerMBean(adapter, adapterName);
adapter.start();
System.out.println("start.....");
}
}
HelloAgent是效複雜的地方,我們來和以前的HelloAgent逐步比較一下,前後有什麼不同:
(1)首先,新的HelloAgent需要將xml資訊讀入到Registry物件中,這是舊HelloAgent所沒有的。
Registry registry = Registry.getRegistry(null, null);
InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
registry.loadMetadata(stream);
stream.close();
(2)接著建立MBeanServer的方式也不同了
現在:MBeanServer server = registry.getMBeanServer();
以前: MBeanServer server = MBeanServerFactory.createMBeanServer();
(3)Hello相應的ObjectName建立也略不相同。主要是域名在XML描述檔案裡設定好了。
現在:ManagedBean managed = registry.findManagedBean("Hello");
ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
以前:ObjectName helloName = new ObjectName("chengang:name=HelloWorld")
(4)得到MBean的方式也不同,這裡就是關鍵的不同點
現在:ModelMBean hello = managed.createMBean(new Hello());
以前:Hello hello = new Hello();
注意:為什麼現在要比以前多一個createMbean步驟呢,就是因為現在的寫法並沒有寫Mbean,所以需要動態才需要生成一個。而以前就直接把new Hello()註冊到mbean server就可以了,server會自動找到它的HelloMBean介面檔案。
也就上面四點區別,其他程式碼完全一樣。測試和檢視效果的方法和以前一樣,在此不累述了。
commons Modeler為Hello動態生成了一個MBean介面:BaseModelBean
參考資料
用Commons Modeler 開發JMX應用
轉載: http://www.blogjava.net/hengheng123456789/articles/66376.html
相關文章
- 基於大模型LLM(包括ChatGPT)的應用開發與輔助程式設計技能大模型ChatGPT程式設計
- AI輔助Kano模型進行產品開發AI模型
- Android開發 - 儲存輔助類 SharedPreferences 解析Android
- web開發安全框架中的Apache Shiro的應用Web框架Apache
- Apache模組開發/用C語言擴充套件apache(3:一個非常簡單的apache module)ApacheC語言套件
- 使用Github Action來輔助專案管理Github專案管理
- Apache模組開發/用C語言擴充套件apache(4:一個生產環境使用的apache module)ApacheC語言套件
- 用Ruby來開發GUI程式GUI
- 【jmx】JMX最佳實踐與詳解
- Ubuntu 中用 delphi 開發 apacheUbuntuApache
- apache模組開發之helloworldApache
- 使用JMX Exporter監控Rainbond上的Java應用ExportAIJava
- 機器學習與移動應用開發的未來機器學習
- JMX簡介
- 用列舉來驅動 TableView 開發View
- Apache Answer Plugin 開發筆記ApachePlugin筆記
- AIoT原生技術帶來更好的應用開發AI
- iOS開發系列–讓你的應用“動”起來iOS
- 通用輔助生成: 使用任意輔助模型加速解碼模型
- web開發實戰教程:Apache Shiro在web專案中的應用WebApache
- 亞信科技基於 Apache SeaTunnel 的二次開發應用實踐Apache
- 用JMX怎樣連線本地JVM上執行的Java程式JVMJava
- 它來了,它來了,HarmonyOS應用開發線上體驗來了
- 用Perl來管理Apache驗證身份時所用的密碼(轉)Apache密碼
- 用Apache的CGI封裝器來加強安全性(轉)Apache封裝
- 零程式碼開發是未來企業應用程式開發的趨勢嗎
- 機器學習輔助催化劑設計,天大團隊開發通用且可解釋的描述符機器學習
- 來開發一個wanandroid快應用吧NaNAndroid
- 學起來:Flutter將支援桌面應用開發Flutter
- 模仿KOA,用php來寫一個極簡的開發框架PHP框架
- 為什麼說敏捷開發是應用程式的未來?敏捷
- 來BSN,體驗更輕鬆的公鏈應用開發
- 使用 NgRX Store Module 給 Angular 應用開發帶來的收益Angular
- [譯] 用 Apache Shiro 來保護一個 Spring Boot 應用ApacheSpring Boot
- 初識用.NET Remoting來開發分散式應用(轉)REM分散式
- JMX-Java Management ExtensionsJava
- cassandra getNaturalEndpoints JMX clientclient
- 【JMX】什麼是MBeanServerBeanServer