工作量管理 |
BeenThere 範例 - TechNotes |
尋找程式碼 |
檢視程式撰寫注意事項 |
BeenThere 應用程式的程式碼在
z/OS 客戶:z/OS 平台不提供範例的程式碼樹狀結構,因為範例應用程式不是在 z/OS 平台上建置的。
BeenThere 應用程式示範 IBM WebSphere Application Server Network Deployment Edition 的工作量管理 (WLM) 功能。BeenThere 應用程式包含 BeenThere Servlet 和 BeenThere Stateless Session Enterprise Bean。BeenThere Servlet 示範 HTTP 要求被分派到的叢集中的應用程式伺服器。BeenThere Enterprise Bean 示範 Enterprise Bean 要求被分派到的叢集中的應用程式伺服器。BeenThere Enterprise Bean 由 BeenThere Servlet 呼叫。
BeenThere Servlet 顯示下列資訊:
此外,BeenThere Servlet 還可以執行下列動作:
下圖說明用來示範 Web 儲存器和 EJB 儲存器工作量管理的範例環境:
圖 1 範例環境
這個環境中的機器包括:
這項配置包含 MyWebCluster 和 MyEJBCluster 兩個伺服器叢集。伺服器叢集由應用程式伺服器群組組成。如果其中一個成員伺服器失敗,要求會遞送到叢集的其他成員。每一個範例叢集都由兩個叢集成員所組成。叢集 MyWebCluster 由叢集成員 WebServer1 和 WebServer2 所組成,而叢集 MyEJBCluster 則由叢集成員 EJBServer1 和 EJBServer2 所組成。
這個已配置的環境是一個只用來示範如何執行 BeenThere 應用程式的範例。在正式作業環境中,請務必小心規劃資源容量,以依據預期的用戶端要求負荷量,來決定要在特定數目的機器之中建立多少個應用程式伺服器成員。
WebSphere Application Server Network Deployment Edition 提供 HTTP 要求和 EJB 要求的工作量管理 (WLM)。
HTTP 要求的工作量管理由 Web 伺服器外掛程式處理。
請考量圖 1 中的配置。web 機器正在執行 IBM HTTP Server,它將 HTTP 要求分派至每一部應用程式伺服器 WebServer1 和 WebServer2,這些伺服器組成 MyWebCluster 叢集的成員,並且正在執行 BeenThere Servlet。這些應用程式伺服器分別在 app1 和 app2 機器上配置。此外,IBM HTTP Server 外掛程式被配置為 WebServer1 具有 WLM 權重 2,WebServer2 具有 WLM 權重 3。您可以將權重視為一個計數器,從它們的配置值開始,每服務一個要求就減少 1。使用循環式程序將要求分派至目前其權重計數器值大於 0 的任何應用程式伺服器。如果這個值為 0,就會跳過該應用程式伺服器。在所有的權重計數器都遞減到 0 之後,所有應用程式伺服器的權重計數器都會被重設為其配置值,分派程序則從頭重新開始。
EJB 要求的工作量管理由 WLM 控制器在 WebSphere Application Server 內部處理。
請考量圖 1 中的配置。A MyEJBCluster 叢集被配置為由應用程式伺服器成員 EJBServer1 和 EJBServer2 所組成,這些成員負責執行 BeenThere Stateless Session Enterprise Bean。BeenThere Servlet 呼叫 Enterprise Bean,來取得關於 Enterprise Bean 執行所在之應用程式伺服器的執行資訊。此外,這些伺服器分別被配置為權重值 1 和 3。
在 z/OS 平台中,加權值用來平衡 HTTP 要求,但不用來平衡網際網路交互 ORB 通訊協定 (IIOP) 要求。
BeenThere 應用程式利用 WebSphere Application Server 中的管理應用程式設計介面。應用程式可以利用這些介面來存取執行時期和環境配置資訊:
提供伺服器端介面來取得應用程式伺服器屬性資訊,以及執行標準 JMX MBean 管理功能的能力。
提供對遠端 AdminService 物件的用戶端介面。AdminClient 類別會透過其中一個支援的「Java 管理延伸規格」(JMX) 連接器,提供一個 Proxy 給遠端 AdminService 物件。
提供介面來本端或遠端查詢或修改配置資料,以及管理應用程式伺服器配置文件的位置和內容。
為了示範應用程式在使用 WebSphere Application Server 管理介面時所具有的強大功能和彈性,BeenThere 應用程式以下列方式利用這所有的介面:
BeenThere Servlet 和 Enterprise Bean 都使用 AdminService 介面,來取得它們執行所在之應用程式伺服器的節點名稱、應用程式伺服器名稱和程序 ID。下列程式碼區段示範如何取得伺服器屬性資訊:
// 取得 WebSphere AdminService。 AdminService adminService = AdminServiceFactory.getAdminService(); // 取得 WebSphere Admin Local Server MBean 實例。 ObjectName localServer = adminService.getLocalServer(); // 取得節點名稱。 nodeName = (String) adminService.getAttribute(localServer, "nodeName"); // 取得應用程式伺服器名稱。 serverName = (String) adminService.getAttribute(localServer, "name"); // 取得應用程式伺服器程序 ID。 serverPid = (String) adminService.getAttribute(localServer, "pid");
AdminClient 介面用來連接至部署管理程式程序,以擷取執行 BeenThere Enterprise Bean 之叢集的所有應用程式伺服器成員的叢集成員權重值。下列程式碼區段示範如何取得 AdminClient 介面的實例:
// 取得 WebSphere AdminService。 AdminService adminService = AdminServiceFactory.getAdminService(); // 取得部署管理程式的 AdminClient 實例。 adminClient = adminService.getDeploymentManagerAdminClient();
ConfigService 介面用來讀取 WebSphere Application Server cell.xml 配置文件,以判斷 BeenThere 應用程式是在 WebSphere Application Server Base Edition 或 Network Deployment Edition 環境中執行。 下列程式區段示範如何判斷應用程式執行所在之環境:
// 建立新的 WebSphere 管理階段作業。 Session session = new Session(); // 取得執行這個 Servlet 之應用程式伺服器的 // WebSphere ConfigService 實例。 ConfigService configService = ConfigServiceFactory.getConfigService(); if (configService != null) { // 讀取 cell.xml 文件 ObjectName cellObj = ConfigServiceHelper.createObjectName(null, "Cell"); ObjectName[] cellObjs = configService.queryConfigObjects(session, null, cellObj, null); if (cellObjs.length != 0) { cellObj = cellObjs[0]; String cellName = (String) configService.getAttribute(session, cellObj, "name"); String cellType = (String) configService.getAttribute(session, cellObj, "cellType"); if (cellType.equals("DISTRIBUTED")) { websphereND = true; } } // 釋放階段作業。 configService.discard(session);如果偵測到 Network Deployment 環境,則會啟用並顯示 Display Bean 叢集成員權重選項,因為這個選項只有在這種類型的環境中有效。否則,這個選項不會顯示成可選取的選項。