利用 JMX 介面來開發您自己的監視應用程式
您可以使用 PerfMBean 或個別 MBean,利用 AdminClient API 來取得「效能監視基礎架構 (PMI)」資料。
開始之前
個別 MBean 會提供 Stats 屬性,讓您從中取得 PMI 資料。 PerfMBean 會提供延伸的 PMI 管理方法,以及更有效的 PMI 資料存取方法。 如果要設定 PMI 模組檢測層次,您必須在 PerfMBean 上呼叫方法。 如果要查詢多個 MBean 中的 PMI 資料,相較於從許多個別 MBean 中取得 Stats 屬性,呼叫 PerfMBean 中的 getStatsArray 方法會更快。 Perf MBean 可以利用單一 JMX 呼叫來提供多個 MBean 中的 PMI 資料,但必須透過個別 MBean 來發出多重 JMX 呼叫。
請參閱「開發管理用戶端程式」主題,以取得 AdminClient JMX 的相關資訊。
關於這項作業
程序
- 建立 AdminClient 的實例。 當使用 AdminClient API 時,您需要先傳遞主機名稱、埠號和連接器類型來建立 AdminClient 的實例。
程式碼範例如下:
AdminClient ac = null; java.util.Properties props = new java.util.Properties(); props.put(AdminClient.CONNECTOR_TYPE, connector); props.put(AdminClient.CONNECTOR_HOST, host); props.put(AdminClient.CONNECTOR_PORT, port); try { ac = AdminClientFactory.createAdminClient(props); } catch(Exception ex) { failed = true; new AdminException(ex).printStackTrace(); System.out.println("getAdminClient: exception"); }
- 利用 AdminClient 來查詢 MBean ObjectName。 取得 AdminClient 實例之後,您可以根據查詢字串,呼叫 queryNames 來取得 MBean ObjectName 的清單。
如果要取得所有 ObjectName,您可以使用下列程式碼範例。
如果您有指定的查詢字串,您會取得 ObjectName 的子集。
取得所有 ObjectName 之後,您可以利用下列程式碼範例來取得所有節點名稱:javax.management.ObjectName on = new javax.management.ObjectName("WebSphere:*"); Set objectNameSet= ac.queryNames(on, null); // 檢查 type、name 和 process 之類的內容來尋找指定的 ObjectName
HashSet nodeSet = new HashSet(); for(Iterator i = objectNameSet.iterator(); i.hasNext(); on = (ObjectName)i.next()) { String type = on.getKeyProperty("type"); if(type != null && type.equals("Server")) { nodeSet.add(servers[i].getKeyProperty("node")); } }
註: 這只會傳回已啟動的節點。如果要列出節點上正在執行的伺服器,您可以檢查所有 ObjectName 的節點名稱和類型,或使用下列程式碼範例:StringBuffer oNameQuery= new StringBuffer(41); oNameQuery.append("WebSphere:*"); oNameQuery.append(",type=").append("Server"); oNameQuery.append(",node=").append(mynode); oSet= ac.queryNames(new ObjectName(oNameQuery.toString()), null); Iterator i = objectNameSet.iterator (); while (i.hasNext ()) { on=(objectName) i.next(); String process= on[i].getKeyProperty("process"); serversArrayList.add(process); }
- 取得您想要從中取得 PMI 資料之應用程式伺服器的 PerfMBean ObjectName。 使用這個程式碼範例:
for(Iterator i = objectNameSet.iterator(); i.hasNext(); on = (ObjectName)i.next()) { // 首先,請確定節點名稱和伺服器名稱符合需求 // 其次,檢查類型是否為 Perf String type = on.getKeyProperty("type"); String node = on.getKeyProperty("node"); String process= on.getKeyProperty("process"); if (type.equals("Perf") && node.equals(mynode) && server.equals(myserver)) { perfOName = on; } }
- 透過 AdminClient,在 PerfMBean 上呼叫作業。 在要從中取得 PMI 資料的應用程式伺服器中取得 PerfMBean 之後,您可以透過 AdminClient API,在 PerfMBean 上呼叫下列作業:
// setStatisticSet: Enable PMI data using the pre-defined statistic sets. Object[] params = new Object[] { com.ibm.websphere.pmi.stat.StatConstants.STATISTIC_SET_EXTENDED}; String[] signature = new String[] {"java.lang.String"}; ac.invoke (perfOName, "setStatisticSet", params, signature); // getStatisticSet:傳回現行統計資料集。 String setname = (String) ac.invoke (perfOName, "getStatisticSet", null, null); // setCustomSetString:利用細部控制來自訂已啟用的 PMI 資料。 // 這個方法可供選擇性地啟用或停用統計資料。自訂 set 規格字串的格式 // 是 STATS_NAME=ID1,ID2,ID3,用 ':' 區隔,其中 STATS_NAME // 和 ID 定義在 com.ibm.websphere.pmi.stat 套件內的 WS*Stat 介面中。 params[0] = new String (WSJVMStats.NAME + "=" + WSJVMStats.HeapSize); params[1] = new Boolean (false); signature = new String[] {"java.lang.String", "java.lang.Boolean"}; ac.invoke (perfOName, "setCustomSetString", params, signature); // 附註:set 字串中未列出的統計資料保持不變。 // getCustomSetString:以字串形式傳回現行自訂 set 規格 String setstring = (String) ac.invoke (perfOName, "getCustomSetString", null, null); // setInstrumentationLevel:設定檢測層次 params[0] = new MBeanLevelSpec(objectName, new int[]{WSJVMStats.HEAPSIZE}); params[1] = new Boolean(true); signature= new String[]{ "com.ibm.websphere.pmi.stat.MBeanLevelSpec","java.lang.Boolean"}; ac.invoke(perfOName, "setInstrumentationLevel", params, signature); // getInstrumentationLevel:取得檢測層次 params[0] = objectName; params[1] = new Boolean(recursive); String[] signature= new String[]{ "javax.management.ObjectName", "java.lang.Boolean"}; MBeanLevelSpec[] mlss = (MBeanLevelSpec[])ac.invoke(perfOName, "getInstrumentationLevel", params, signature); // setInstrumentationLevel:設定檢測層次(在第 6.0 版中已淘汰) params[0] = new MBeanLevelSpec(objectName, optionalSD, level); params[1] = new Boolean(true); signature= new String[]{ "com.ibm.websphere.pmi.stat.MBeanLevelSpec","java.lang.Boolean"}; ac.invoke(perfOName, "setInstrumentationLevel", params, signature); // getInstrumentationLevel:取得檢測層次(在第 6.0 版中已淘汰) Object[] params = new Object[2]; params[0] = new MBeanStatDescriptor(objectName, optionalSD); params[1] = new Boolean(recursive); String[] signature= new String[]{ "com.ibm.websphere.pmi.stat.MBeanStatDescriptor", "java.lang.Boolean"}; MBeanLevelSpec[] mlss = (MBeanLevelSpec[])ac.invoke(perfOName, "getInstrumentationLevel", params, signature); // getConfigs:取得所有 MBean 的 PMI 靜態配置資訊 configs = (PmiModuleConfig[])ac.invoke(perfOName, "getConfigs", null, null); // getConfig:取得特定 MBean 的 PMI 靜態配置資訊 ObjectName[] params = {objectName}; String[] signature= { "javax.management.ObjectName" }; config = (PmiModuleConfig)ac.invoke(perfOName, "getConfig", params, signature); // getStatsObject:您可以使用 ObjectName 或 MBeanStatDescriptor Object[] params = new Object[2]; params[0] = objectName; // either ObjectName or or MBeanStatDescriptor params[1] = new Boolean(recursive); String[] signature = new String[] { "javax.management.ObjectName", "java.lang.Boolean"}; Stats stats = (Stats)ac.invoke(perfOName, "getStatsObject", params, signature); // 附註:傳回的資料只有動態資訊(值和時間戳記)。 // 請參閱 PmiJmxTest.java 來取得其他程式碼,將配置資訊 // 與傳回的資料鏈結起來。 // getStatsArray:您可以使用 ObjectName 或 MBeanStatDescriptor ObjectName[] onames = new ObjectName[]{objectName1, objectName2}; Object[] params = new Object[]{onames, new Boolean(true)}; String[] signature = new String[]{"[Ljavax.management.ObjectName;", "java.lang.Boolean"}; Stats[] statsArray = (Stats[])ac.invoke(perfOName, "getStatsArray", params, signature); // 附註:傳回的資料只有動態資訊(值和時間戳記)。 // 請參閱 PmiJmxTest.java 來取得其他程式碼,將配置資訊 // 與傳回的資料鏈結起來。 // listStatMembers:導覽 PMI 模組樹狀結構 Object[] params = new Object[]{mName}; String[] signature= new String[]{"javax.management.ObjectName"}; MBeanStatDescriptor[] msds = (MBeanStatDescriptor[])ac.invoke(perfOName, "listStatMembers", params, signature); //或者,// Object[] params = new Object[]{mbeanSD}; // String[] signature= new String[]{"com.ibm.websphere.pmi.stat.MBeanStatDescriptor"}; // MBeanStatDescriptor[] msds = (MBeanStatDescriptor[])ac.invoke // (perfOName, "listStatMembers", params, signature); // 請參閱已淘汰類別的 API 文件
- 如果要使用個別 MBean:您需要取得 AdminClient 實例和個別 MBean 的 ObjectName。 之後,您便可以簡單取得 MBean 上的 Stats 屬性。


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tprf_pmijmx
檔名:tprf_pmijmx.html