Java管理API (JMX)對管理WebLogic服務器而言是必需的。通過這個API,你可以在應用程序服務器裡搜索管理beans (mbeans) 並且通過它們你既可以查詢配置信息又可以查詢runtime監控信息。 此外,通過這個API還可以用來改變服務器的配置。 事實上,這個API 已在控制台和其他的管理工具上使用著,用來完成它們的工作和提供報告數據。
這個API是一個強大的監控工具。讓我們來看一個例子。 在這個應用程序中,有大部分的靜態內容,一些你的個性化的JSP頁面,一個注冊系統,一個基於JMS(Java Messaging Services,Java消息服務)的數據系統,以及一個小付費應用系統。在這個應用程序中在哪裡使用JMX對我們有利呢?在靜態頁面上,你可以為FileServlet存取信息並且可以看到花費了多少時間用來服務靜態內容。時間可能比你預期的要少,因為浏覽器自動的在客戶端緩存了部分內容。大多數對靜態內容的請求將會是HEAD請求,用來檢查變化。
對於動態頁面,在系統中的每個servlet是被分別計算地。這個數據不能很好的反映用戶的經驗 (因為用戶在他們送出請求和接到頁面的返回之間存在延遲),但是這些數據告知了平均每個servlet花在一個請求上的時間,以及多少個請求被完成。我們的注冊系統是一個實體bean,而付費系統是一個由外部服務返回的無狀態會話bean。 兩個bean都能被監控,而且通過這些監控信息可以幫助我們用來優化緩存和池的大小。我們的數據同樣能有助於決定是否我們已經得到了所需要的信息,或是決定多少用戶正在使用數據。吞吐量也可以使用JMS的topic和queue類型的mbean的屬性來計算。此外,所有的JDBC連接都可以被監控,而且從它們的mbeans你能發現多少連接池被爭用,舉例來說,這將幫助你判斷是否需要更多的數據庫客戶端授權。
mbeans 在WebLogic服務器中的第二種用途是用於配置信息。通過配置mbeans,所有資源的配置都被包含在runtime中。這些mbeans本質上是被包含在config.xml文件裡的信息的表示。部署在服務器監聽端口上的應用程序的所有內容都包括在這些接口中。大多數個別的屬性是直接相關直接;然而,描述一個部署單元的屬性集合是復雜的並且為了方便它們被集合在weblogic.Deployer類中。直接訪問它們是可能的,但是除了看配置以及不改變它之外的操作是不被推薦的。其余的屬性是隨意的,但要小心,但如果組件(如JDBC池)被重新部署或服務器重新啟動,大多數這些屬性實際上只改變運行時的行為。這些配置性的mbeans 應用的作用范圍從決定為某一特定應用使用資源,到調整基於來自監mbeans的反饋數值。
正如你所看到的,這有許多信息――但是如果你對JMS和WebLogic服務器都不熟悉,你如何著手呢? 它實際上不那麼難。 只要你能使用JNDI並且可以閱讀JavaDocs你就會發現操縱 mbeans是相當容易的。在下面你所看見的代碼示例中,會告訴你如何得到本地服務器的mbean home接口以及JDBC池。
MBeanHome home = (MBeanHome) new
InitialContext().lookup(MBeanHome.LOCAL_JNDI_NAME);
Set pools = home.getMBeansByType("JDBCConnectionPool");
上面的代碼給出了對於JDBC(Java DataBase Connectivity,Java數據庫連接)池的配置mbean。如果你想監控連接池而不考慮它們的配置,只要通過添加"Runtime"來改變mbean的類型就可以完成。從這個mbean你可以確定重要的信息,比如是否有連接洩漏――你甚至可以得到一個堆棧追蹤,找到該連接的具體位置。
如果你不想做任何Java編程,就像從一個腳本文件中一樣的使用JMX mbean系統,怎麼辦?幸運的是我們有一個命令行工具,它能讓你以命令行的方式直接查看和改變mbean-weblogic.Admin。除了PINGing服務器,得到JNDI列表,重置連接池,以及關閉服務器外,它給出了直接訪問mbean的分層結構。在下面的代碼示例中你將看到這樣的一個weblogic.Admin的指令。
java weblogic.Admin -username system -password [password] -url [url] GET
-pretty -type JDBCConnectionPool
相比於在這些mbeans上加上屬性的類型描述器,這段代碼給出了關於mbean的簡單易讀的描述。同樣的,有一個SET命令會在系統中改變任何mbean的屬性。
擁有這種工具你應該能夠在Java內部以及從腳本外部監控你的應用程序。