首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

J2EE 分散式環境下 Observer 模式實戰:從 EJB 陷阱到 JMS 解決方案

     編輯:Java 相關知識

設計模式的核心:意圖重於實作

設計模式是經驗的文檔化,核心在於理解其「意圖」而非死守類圖。在分散式、多層 J2EE 系統中,Observer 模式用於解耦模型層(EJB)與視圖層(Web Tier),支援多視圖同步、並行開發、需求變更隔離。但 Java 標準庫的 Observable/Observer 設計用於單一 JVM,直接套用至 EJB 會遭遇序列化與遠端參考傳遞的根本衝突。

圖 1. 三層架構

EJB 參數傳遞機制深度解析

值傳遞(序列化)

實作 Serializable 的物件以「複製傳遞」方式在層間流動。Entity Bean 持有 Web 層物件的副本,修改副本不影響原物件 — 這是典型 Observer 實作失效的主因。

遠端參考傳遞(Stub/Skeleton)

EJB 物件由 Home/Remote 介面與 Bean 類組成,容器產生 Stub(客戶端 Proxy)與 Skeleton(伺服端)。Stub 透過 Socket 將方法簽名傳給 Skeleton,再委派 Object Server 執行邏輯。此機制下,遠端介面參數傳遞實為「遠端參考傳遞」,修改會反映至伺服端真實物件。

圖 2. 分散式物件架構

典型錯誤實作與修正策略

錯誤:Web 層物件觀察 Entity Bean(Subject)

Web 類實作 Serializable 作為 Observer,Entity Bean 為 Subject。執行時 Entity Bean 持有 Observer 副本,通知副本無法更新原始 Web 物件。

修正:反轉角色 — Entity Bean 觀察 Web 層 Subject

Web 類持有 Entity Bean 遠端參考(Stub),事件發生時通知 Stub,真實 Entity Bean 獲更新。Observer 物件序列化傳入 Entity Bean 僅供讀取資料,值傳遞語意正確。但需注意:EJB 業務方法必須拋出 RemoteException,標準 Observer 介面需調整。

圖 3. Observer 設計模式結構

JMS 訊息驅動:分散式 Observer 的最佳實踐

JMS 發布/訂閱模天然符合 Observer 意圖:鬆耦合、非同步、動態訂閱。結合訊息驅動 Bean(MDB)作為消費者,容器自動管理 JMS 連線、交易、並發,開發者僅需實作 onMessage()。

MDB Facade 模式擴展性

單一 MDB 作為多個 Session Bean 的 Facade,Session Bean 再作為多個 Entity Bean 的 Facade,構建分層訊息路由。MDB 本質為無狀態 Session Bean 變體,無 Remote/Home 介面,配置為特定 Topic/Queue 客戶端。

圖 4. MDB Facade 模式

實作關鍵點總結

  • 單一 JVM:可直接使用 java.util.Observable/Observer
  • EJB 環境:必須區分值傳遞與遠端參考傳遞語意,正確分配 Subject/Observer 角色
  • 跨層、高擴展、非同步需求:優先選擇 JMS + MDB 架構
  • 複雜路由需求:採用 MDB Facade + Session Bean Facade 分層組合

結語

在 J2EE 實作 Observer 模式,關鍵不在於複製教科書類圖,而在於深入理解分散式參數傳遞語意、EJB 容器服務模型、JMS 訊息語意。正確選擇:單機用標準庫、同步遠端用反轉角色 EJB 方案、非同步解耦用 JMS/MDB。掌握模式意圖,因地制宜調整實作細節,才能構建健壯、可擴展的企業級應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved