一、EJB 體系架構
上層分散式應用基於物件組件模型,底層事務服務用 API 技術。EJB 簡化 Java 企業應用開發、部署、執行。規格由 Sun 制定,Inprise 容器基於 1.1 版。
核心流程:開發者撰寫 Enterprise Beans (可重用組件) → 組合打包含配置參數的特定檔案 → 部署至裝載 EJB 容器的平台 → Client 透過 Home 介面定位 Bean 並產生實例 → 呼叫 Bean 業務方法與 Remote 介面。
二、EJB 伺服器與容器分工
- EJB Server:管理容器與功能,提供系統服務存取 (資料庫管理、事務管理、其他 Enterprise 應用伺服器)。
- EJB Container:所有 Bean 實例運行於此。提供系統級服務,控制 Bean 生命週期。容器掌握多數系統級議題,Bean 開發者無需在應用邏輯中考慮:
- 安全性:部署描述符定義 Client 存取權限,容器僅允許授權 Client 存取。
- 遠端連線:管理底層通訊議題,對 Bean 開發者與 Client 隱藏。開發者如呼叫本地平台,Client 不知方法可能在遠端處理。
- 生命週期管理:Client 簡單建立/移除實例,容器管理實例池實現最大效能與記憶體利用率,激活/去活 Bean、維護共享實例池。
- 事務管理:部署描述符定義事務需求,容器管理分散式事務複雜議題 (跨平台更新資料庫),保證 ACID,失敗則回滾。
三、Enterprise Bean 組件特徵
- 包含處理企業資料的應用邏輯。
- Provider 定義 Client 介面 (Remote 介面),不受容器/伺服器影響,組裝應用時無需改碼重編譯。
- 可客製化:安全、事務等系統級服務非屬 Bean 類別,由部署組裝工具實現。
四、兩大 Bean 類型
Session Bean
- 單一 Client 執行物件,容器回應遠端任務請求產生實例。
- 一對一 Client 關係,代表 Client 在伺服端。
- 可參與事務更新共享資料,但不直接描繪共享資料。
- 生命週期短:Client 保持會話時存活,Client 退出即解除關聯。屬暫態:容器崩潰需重建 Session 物件續行會話。
- 有狀態:會話期間保持 Client 資訊。會話終止失去狀態。
- 無狀態:不保持 Client 資訊。方法調用時才知參數,調用結束不保持。所有實例等價 (除調用期間),支援多 Client,容器可指派任一實例給任一 Client。
Entity Bean
- 提供資料庫資料的物件視圖 (如對應資料表一列)。
- 多 Client 可共享存取同一 Entity Bean,並發存取透過事務上下文保證資料完整性。
- 生命週期長、狀態持久:資料庫資料存在即存活,不依應用/服務進程。容器崩潰仍存活。
- 持久性可由容器 (CMP) 或 Bean 自身 (BMP) 管理。BMP 需自寫資料庫存取代碼。
- 以 主鍵 識別 (唯一物件識別符),通常對應資料庫主鍵 (如表列),Client 憑主鍵定位特定資料。
五、EJB 六大角色分工
將開發劃分六角色,各司其職,簡化應用開發者工作:
基礎建設角色
- EJB Server Provider:提供分散式底層服務平台與設施、執行環境。
- EJB Container Provider:分散式系統/事務/安全專家。提供部署工具與運行時支援。容器為一或多 Bean 的運行時系統,整合 Bean 與事務/安全/分散式網管服務。產生客製化代碼與詳細代碼工具,提供部署工具與監控方法。
應用角色
- Enterprise Bean Provider:應用領域專家 (金融/電信等)。提供業務任務、業務方法、Remote/Home 介面、部署描述符。容器處理系統級任務,Provider 專注應用邏輯。
- Application Assembler:將客製 Bean 與其他組件 (GUI Client、Applet、Servlet) 組裝成完整應用。僅關心 Bean 介面,不關心實作。
部署與操作角色
- Deployer:為特定 Bean 配置操作環境。組合多 Bean、修改屬性 (透過部署描述符設定事務/安全策略)、整合既有 Enterprise 管理軟體。
- System Administrator:管理底層計算/網路服務 (含 EJB 服務/容器)。監控應用伺服器狀態、異常處理。透過容器 Hook 與管理工具互動。
傳統開發者現為 Bean Provider/Assembler,專注應用問題/邏輯。安裝時 Deployer 定義策略,機制複雜性交給專門代理。分散式應用仍複雜,但應用設計者工作簡化了。
六、EJB 設計模式與命名慣例
三種建立分散式系統途徑對應 EJB 模式:
- 無狀態服務 → Stateless Session Bean
- 基於會話 → Stateful Session Bean
- 持久物件 → Entity Bean
每種模式定義介面與命名慣例,透過大量預先定義與命名慣例達成規格目的,限制自由度但讓伺服器/容器提供者能假定應用設計並有效支援。