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

EJB Stub/Skeleton 深度解析:從 RMI 原理到 WebSphere/WebLogic 實作全流程

     編輯:Java 相關知識

EJB 遠程調用的本質是 RMI(Remote Method Invocation),但經過容器層層包裝,形成雙重 RMI 迴路。本文從手寫 RMI 原型入手,逐層剖析 WebSphere 與 WebLogic 的 10 類別生成機制與調用鏈路,還原 EJB 分布式調用的真實面貌。

RMI 核心原理:Stub/Skeleton 雙邊協作

RMI 實現跨 JVM 呼叫:Client 端 Stub 封裝參數透過 Socket 發送,Server 端 Skeleton 解封並呼叫真實物件,再將結果返回。關鍵點:

  • Stub 與遠端物件實作同一介面,Client 面向介面編程(Person person = new Person_Stub())。
  • Stub 負責序列化方法名與參數,Skeleton 負責分派呼叫與序列化返回值。
  • 傳遞物件需實作 Serializable,採值傳遞語義。

WebSphere 實作:雙重 RMI 迴路的 10 類別全景

一個 Stateless Session Bean 經 WSAD 編譯生成 10 個 Class:

序號類別角色
1UserServiceHomeHome 介面(開發者編寫)
2UserServiceRemote 介面(開發者編寫)
3UserServiceBeanBean 實作(開發者編寫)
4_UserServiceHome_StubHome Stub(Client 端動態載入)
5_EJSRemoteStatelessUserServiceHome_..._TieHome Skeleton(Server 端,Tie=CORBA 術語)
6EJSRemoteStatelessUserServiceHome_...Home Server 端實作
7EJSStatelessUserServiceHomeBean_...Home Bean 包裝器,負責建立 Remote Stub
8_UserService_StubRemote Stub(Client 端動態載入)
9_EJSRemoteStatelessUserService_..._TieRemote Skeleton(Server 端)
10EJSRemoteStatelessUserService_...Remote Server 端實作,委派給 Bean

第一迴路:獲取 Remote Stub

  1. Client JNDI 查找獲取 _UserServiceHome_Stub(偽裝為 Home 介面)。
  2. 呼叫 home.create() → Stub 發送 "create" 字串 → Skeleton 接收分派 → Home Server 實作 create() → 委派 HomeBean 包裝器 createWrapper() → 返回 _UserService_Stub。
  3. 為何需 HomeBean 包裝器?因 Home Server 實作繼承 EJSWrapper 無建立 Stub 能力,必須委派繼承 EJSHome 的 HomeBean。

第二迴路:業務方法調用

  1. Client 呼叫 object.getUserInfo() → Remote Stub 發送方法名與參數 → Remote Skeleton 分派 → Remote Server 實作 getUserInfo() → 容器 preInvoke() → 終於呼叫 UserServiceBean.getUserInfo()。

WebLogic 實作:動態生成與 10 類別映射

WebLogic 差異在於:

  • EJBC 編譯期生成 Bean 實作類、Home/Remote Server 實作類(共 3 個可見 Class)。
  • 部署時動態生成 Stub/Skeleton 位元組碼(4 個不可見 Class),Server 自動序列化 Stub 發送給 Client,Client 無需預置 Stub Class。
  • 調用流程同雙重 RMI:JNDI 獲取 Home Stub → create() 經 Home Skeleton/Server → 返回 Remote Stub → 業務調用經 Remote Skeleton/Server → 委派 Bean 實作。

架構本質回顧:為何需要 10 個類?

作者以演進視角還原設計必然性:

  1. 跨 JVM 呼叫 → 引入 RMI Stub/Skeleton(4 類)。
  2. 事務/安全/池化管理 → 引入 EJBObject 代理層(Remote 介面 + Stub/Skeleton + Server 實作 = 4 類)。
  3. 多 Server 支援與 EJBObject 管理 → 引入 EJBHome 工廠層(Home 介面 + Stub/Skeleton + Server 實作 + HomeBean 包裝器 = 4 類,其中 Home Server 實作繼承 EJSWrapper 需額外包裝器)。

總計 10 類,各司其職,無一冗餘。EJB 基於 RMI-IIOP,完美屏蔽網絡細節,保護業務代碼純粹性。

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