top
Loading...
定義Service4JMX2組件簡單擴展MX4j
前做的服務器框架,已經支持JMXri的JMX實現,但框架直接綁定JMX環境,不是一個良好的設計,當時沒想到好辦法。最近研究MX4j的實現,重構了一下,可以同時支持JMXri和MX4j了,與JMX環境接耦了。現在又有了新的需求,要求提供HttpServer功能,在Service4Sock的基礎上已經實現了,但是浪費了一個端口資源,需要想辦法與JMX公用才好。繼續研究MX4j的源碼,又有了新的收獲。

已經完成的工作:
* 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功能。

代碼
  1. public interface MyHttpAdaptorMBean extends HttpAdaptorMBean, MBeanRegistration {}   
  2. public class MyHttpAdaptor extends HttpAdaptor implements MyHttpAdaptorMBean {}  

研究mx4j.tools.adaptor.http.HttpAdaptor源碼,發現以下幾處:
1,缺省提供的功能項:
代碼
  1. private String[][] defaultCommandProcessors = {   
  2.    {"server""mx4j.tools.adaptor.http.ServerCommandProcessor"},   
  3.    {"serverbydomain""mx4j.tools.adaptor.http.ServerByDomainCommandProcessor"},   
  4.    {"mbean""mx4j.tools.adaptor.http.MBeanCommandProcessor"},   
  5.    {"setattributes""mx4j.tools.adaptor.http.SetAttributesCommandProcessor"},   
  6.    {"setattribute""mx4j.tools.adaptor.http.SetAttributeCommandProcessor"},   
  7.    {"getattribute""mx4j.tools.adaptor.http.GetAttributeCommandProcessor"},   
  8.    {"delete""mx4j.tools.adaptor.http.DeleteMBeanCommandProcessor"},   
  9.    {"invoke""mx4j.tools.adaptor.http.InvokeOperationCommandProcessor"},   
  10.    {"create""mx4j.tools.adaptor.http.CreateMBeanCommandProcessor"},   
  11.    {"constructors""mx4j.tools.adaptor.http.ConstructorsCommandProcessor"},   
  12.    {"relation""mx4j.tools.adaptor.http.RelationCommandProcessor"},   
  13.    {"empty""mx4j.tools.adaptor.http.EmptyCommandProcessor"}};  
2,用戶增加新的頁面:
代碼
  1. public void addCommandProcessor(String path, HttpCommandProcessor processor)   
  2. public void addCommandProcessor(String path, String processorClass)  
3,設置XSLT解析器:
代碼
  1. public void setProcessor(ProcessorMBean processor)   
  2. public void setProcessorClass(String processorClass)   
  3. public void setProcessorNameString(String processorName) throws MalformedObjectNameException   
  4. 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的。

代碼
  1. private String path = "mx4j/tools/adaptor/http/xsl";  

2,系統缺省訪問的 serverbydomain 功能項
代碼
  1. private String defaultPage = "serverbydomain";  

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗