六、 創建JMXServiceURL
到現在為止,我們已經創建了一個MBeanServer並且用它注冊了LoginStatsMBean。下一步是使得該服務器對客戶可用。為此,我們必須創建一個JMXServiceURL-它描述了客戶將用來存取該JMX服務的URL:
JMXServiceURL url = new JMXServiceURL("rmi",null,
Constants.MBEAN_SERVER_PORT,
"/jndi/rmi://localhost:" +Constants.RMI_REGISTRY_PORT +"/jmxapp");
讓我們細致地分析一下上面一行代碼。該JMXServiceURL構造器使用了四個參數:
1. 在連接時使用的協議(rmi,jmxmp,iiop,等等)。
2. JMX服務的主機。用localhost作為參數就足夠了。然而,提供null強制JMXServiceURL找到可能是最好的主機名。例如,在這種情況下,它將把null翻譯成zarar-這是我的計算機的名字。
3. JMX服務使用的端口。
4. 最後,我們必須提供URL路徑-它指示怎樣找到JMX服務。在這種情況下,它會是/jndi/rmi://localhost:1099/jmxapp。
其中,/jndi部分是指,客戶必須為JMX服務做一下JNDI查詢。rmi://localhost:1099指示,存在一個運行於本機的端口1099的RMI注冊。這裡的jmxapp是在RMI注冊中唯一標識這個JMX服務的。在JMXServiceURL對象上的一個toString()產生下列結果:
service:jmx:rmi://zarar:9589/jndi/rmi://localhost:1100/jmxapp
上面是客戶將最終使用來連接到該JMX服務的URL。J2SE 5.0文檔有關於這個URL結構的更為詳細的解釋。
(一) 保護服務
J2SE 5.0提供了一種有利於JMX用一種容易的方式進行用戶認證的機制。我創建了一個簡單的文本文件-它存儲用戶名和口令信息。文件的內容是:
zarar siddiqi
fyodor DOStoevsky
用戶zarar和fyodor被分別通過口令siddiqi和DOStoevsky認證。下一步是創建並保護一個JMXConnectorServer,它暴露了該MbeanServer。username/password文件的路徑被存儲在該鍵下的一個映射中-jmx.remote.x.passWord.file。這個映射在以後創建JMXConnectorServer時使用。
ServletContext context = Config.getServletContext();
//得到存儲jmx用戶信息的文件
String userFile =context.getRealPath("/")+"/Web-INF/classes/"+Constants.JMX_USERS_FILE;
//創建authenticator並且初始化RMI服務器
Map<string> env = new HashMap<string>();
env.put("jmx.remote.x.passWord.file", userFile);
現在,讓我們創建JMXConnectorServer。下面一行代碼完成這一功能:
connectorServer = JMXConnectorServerFactory.
newJMXConnectorServer(url, env, server);
這個JMXConnectorServerFactory.newJMXConnectorServer(JMXServiceURL,Map,MBeanServer)方法使用我們剛創建的三個對象作為參數-它們是JMXServiceURL,存儲認證信息的映射和MBeanServer。其中,connectorServer實例變量允許我們分別在應用程序啟動和停止時,分別用start()和stop()來啟動和停止JMXConnectorServer。
提示 盡管JSR 160的J2SE 5.0實現相當有力;但是另外的實現,例如MX4J,也提供了一些類-它們提供了方便的特性,例如口令混淆,也就是PassWordAuthenticator類。
本文來自編程入門網:http://www.bianceng.cn/Programming/Java/201107/28048_3.htm