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

EJB 遠程調用原理深度解析:從 RMI 到 WebLogic 實現的完整呼叫鏈路

     編輯:Java 相關知識

前言

EJB 遠程調用涉及 RMI、JNDI、Stub/Skeleton、容器生成類等核心機制。本文基於 WebLogic 實現,詳細拆解從客戶端 JNDI 查找到 Bean 方法執行的完整呼叫鏈路,釐清 10 個類文件的角色與生成時機。

一、類文件清單(以 WebLogic 為例)

角色類名稱來源
Bean 類HelloBean用戶編寫
Bean WebLogic 實現類HelloBean_Implejbc 編譯生成
Remote 介面Hello用戶編寫
Remote WL 實現類HelloBean_EOImplejbc 生成
Remote WL StubHelloBean_EOImpl_WLStub部署時動態生成位元碼
Remote WL SkeletonHelloBean_EOImpl_WLSkeleton部署時動態生成位元碼
Home 介面HelloHome用戶編寫
Home WL 實現類HelloBean_HomeImplejbc 生成
Home WL StubHelloBean_HomeImpl_WLStub部署時動態生成位元碼
Home WL SkeletonHelloBean_HomeImpl_WLSkeleton部署時動態生成位元碼

關鍵差異: RMI 需客戶端預備 Stub 類,EJB 由伺服器動態傳送 Stub 實例,客戶端僅需介面類(Hello.class, HelloHome.class)。

二、完整調用流程(兩次 RMI 循環)

階段 1:獲取 Home Stub(第 1 次 RMI)

  1. 客戶端:ctx.lookup("Hello") → JNDI 查找。
  2. 伺服器:JNDI 綁定對象實為 HelloBean_HomeImpl_WLStub 實例,序列化傳回。
  3. 客戶端:反序列化得到 home(實為 Home Stub),調用 home.create()。
  4. RMI 傳輸:Stub 發送調用訊息 → 伺服器 Skeleton 接收 → 調用 HelloBean_HomeImpl.create()。

階段 2:創建 EJB 並獲取 Remote Stub

  1. 伺服器 HelloBean_HomeImpl.create() → 調用 HelloBean_Impl.ejbCreate() 創建 Bean 實例。
  2. 生成 HelloBean_EOImpl_WLStub 實例,序列化傳回客戶端。
  3. 客戶端得到 Hello h = home.create()(實為 Remote Stub)。

階段 3:業務方法調用(第 2 次 RMI)

  1. 客戶端:h.helloWorld() → 實際調用 HelloBean_EOImpl_WLStub.helloWorld()。
  2. RMI 傳輸 → 伺服器 HelloBean_EOImpl_WLSkeleton 接收 → 調用 HelloBean_EOImpl.helloWorld()。
  3. HelloBean_EOImpl 轉調用 HelloBean_Impl.helloWorld() → 最終執行用戶編寫的 HelloBean.helloWorld()。

三、關鍵設計模式與機制

  • 代理模式:Stub 為遠程對象的本地代理,實現同樣介面。
  • 雙層代理:Home 與 Remote 分別有獨立 Stub/Skeleton 對,職責分離。
  • 容器生成類:_Impl 類由 ejbc 靜態生成,Stub/Skeleton 由容器運行時動態生成(WebLogic 特有)。
  • 序列化傳遞:Stub 實例跨 JVM 傳遞,實現位置透明。

四、客戶端代碼視角 vs 實際運行視角

// 客戶端代碼
HelloHome home = (HelloHome) PortableRemoteObject.narrow(ctx.lookup("Hello"), HelloHome.class);
Hello h = home.create();
h.helloWorld();

// 實際運行對象
home.toString() → "HelloBean_HomeImpl_WLStub@18c458"
h.toString()    → "HelloBean_EOImpl_WLStub@8fa0d1"

雖代碼操作介面,實際操作的是 Stub 實例。介面僅為編譯期契約。

五、總結

EJB 遠程調用本質是 兩次完整的 RMI 循環:第一次獲取 Home 代理並創建 Bean,第二次獲取 Remote 代理並執行業務邏輯。WebLogic 通過 ejbc 預生成實現類、部署時動態生成 Stub/Skeleton,實現了開發簡單(僅寫 3 個介面/類)與運行時分散式透明的平衡。

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