定義Service4JMX2組件簡單擴展MX4j
前做的服務器框架,已經支持JMXri的JMX實現,但框架直接綁定JMX環境,不是一個良好的設計,當時沒想到好辦法。最近研究MX4j的實現,重構了一下,可以同時支持JMXri和MX4j了,與JMX環境接耦了。現在又有了新的需求,要求提供HttpServer功能,在Service4Sock的基礎上已經實現了,但是浪費了一個端口資源,需要想辦法與JMX公用才好。繼續研究MX4j的源碼,又有了新的收獲。
研究mx4j.tools.adaptor.http.HttpAdaptor源碼,發現以下幾處:
1,缺省提供的功能項:
2,用戶增加新的頁面:
3,設置XSLT解析器:
4,defaultCommandProcessors在preRegister()/buildCommands()中被添加到commands中。而commands在run()/getProcessor(String path)中使用,然后由postProcess(httpOut, httpIn, document)來處理,最后生成text/html文檔。因而可能需要修改postProcess,判斷對應的xsl文件是否存在。
2,系統缺省訪問的 serverbydomain 功能項
已經完成的工作:
* DONE 定義Service4JMX服務器組件,使用JMX技術僅僅為了便于管理;主要使用Spring作為IoC容器;
* DONE 修改register/unregister;對于"Start:開頭的,自動調用start()/stop()
* DONE 定義Service4JMX2服務器組件,同時支持JMXri和MX4j等多種JMX實現!
* DONE 開頭對應Domain;修改為標志:start=1,stop=1
* DONE 使用JMXri返回html能直接顯示;而在MX4j中被自動替換;
* DONE 配置:對于MX4j使用processorNameString替換processorName,后者需要ObjectName類型;
* TODO 如何直接顯示某個xml文檔,而非html文檔?(即沒有XSLT解析器)
某個業務日志需求
(1)業務日志需要按天寫到一文件中去,一天一個文件,參照以前日志文件規則
(2)服務器支持一監控端口,用戶可以通過瀏覽器訪問端口獲取數據頁面
(3)用戶可見到的數據內容參考老的業務服務器內容
(4)用戶view由日志內容和一樣式文件組合而成,采用技術為xml(日志內容)+xsl(樣式文件)
我的思路是,擴展HttpAdaptor的實現,定義若干新的Command功能。
代碼
- public interface MyHttpAdaptorMBean extends HttpAdaptorMBean, MBeanRegistration {}
- public class MyHttpAdaptor extends HttpAdaptor implements MyHttpAdaptorMBean {}
研究mx4j.tools.adaptor.http.HttpAdaptor源碼,發現以下幾處:
1,缺省提供的功能項:
代碼
- private String[][] defaultCommandProcessors = {
- {"server", "mx4j.tools.adaptor.http.ServerCommandProcessor"},
- {"serverbydomain", "mx4j.tools.adaptor.http.ServerByDomainCommandProcessor"},
- {"mbean", "mx4j.tools.adaptor.http.MBeanCommandProcessor"},
- {"setattributes", "mx4j.tools.adaptor.http.SetAttributesCommandProcessor"},
- {"setattribute", "mx4j.tools.adaptor.http.SetAttributeCommandProcessor"},
- {"getattribute", "mx4j.tools.adaptor.http.GetAttributeCommandProcessor"},
- {"delete", "mx4j.tools.adaptor.http.DeleteMBeanCommandProcessor"},
- {"invoke", "mx4j.tools.adaptor.http.InvokeOperationCommandProcessor"},
- {"create", "mx4j.tools.adaptor.http.CreateMBeanCommandProcessor"},
- {"constructors", "mx4j.tools.adaptor.http.ConstructorsCommandProcessor"},
- {"relation", "mx4j.tools.adaptor.http.RelationCommandProcessor"},
- {"empty", "mx4j.tools.adaptor.http.EmptyCommandProcessor"}};
代碼
- public void addCommandProcessor(String path, HttpCommandProcessor processor)
- public void addCommandProcessor(String path, String processorClass)
代碼
- public void setProcessor(ProcessorMBean processor)
- public void setProcessorClass(String processorClass)
- public void setProcessorNameString(String processorName) throws MalformedObjectNameException
- public void setProcessorName(ObjectName processorName)
4,defaultCommandProcessors在preRegister()/buildCommands()中被添加到commands中。而commands在run()/getProcessor(String path)中使用,然后由postProcess(httpOut, httpIn, document)來處理,最后生成text/html文檔。因而可能需要修改postProcess,判斷對應的xsl文件是否存在。
研究mx4j.tools.adaptor.http.XSLTProcessor源碼,發現以下幾處:
1,在mx4j-3.0.1srcoolsmx4joolsadaptorhttpxsl目錄下有很多xsl文件,用于解析xml的。
代碼
- private String path = "mx4j/tools/adaptor/http/xsl";
2,系統缺省訪問的 serverbydomain 功能項
代碼
- private String defaultPage = "serverbydomain";