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

EJB 調用原理深度解析(二):WebLogic Stub/Skeleton 交互全流程

     編輯:Java 相關知識

WebLogic EJB 類結構圖譜

以 HelloBean 為例,部署後生成的關鍵類:

  • Bean 類:HelloBean (用戶編寫)
  • Bean 邏輯實現:HelloBean_Impl (EJBC 生成,繼承 Bean)
  • Home 接口:HelloHome (用戶編寫)
  • Home 邏輯實現:HelloBean_HomeImpl (EJBC 生成)
  • Home Stub:HelloBean_HomeImpl_WLStub (部署時動態生成字節碼)
  • Home Skeleton:HelloBean_HomeImpl_WLSkeleton (部署時動態生成)
  • Remote 接口:Hello (用戶編寫)
  • Remote 邏輯實現:HelloBean_EOImpl (EJBC 生成,實現 Remote)
  • Remote Stub:HelloBean_EOImpl_WLStub (部署時動態生成)
  • Remote Skeleton:HelloBean_EOImpl_WLSkeleton (部署時動態生成)

客戶端僅需 Hello.class、HelloHome.class 兩個接口文件。

JNDI 查找與 Stub 獲取

HelloHome home = (HelloHome) PortableRemoteObject.narrow(
    ctx.lookup("Hello"), HelloHome.class);

調用 home.toString() 輸出:HelloBean_HomeImpl_WLStub@18c458 —— 客戶端拿到的實際是 Home Stub 實例,而非服務端實現類。Stub 實現了 Home 接口,序列化傳遞給客戶端。

create() 調用鏈——第一次 RMI 循環

Hello h = home.create();  // 實際調用 HelloBean_HomeImpl_WLStub.create()
  1. 客戶端調用 Stub create()
  2. Stub 發送調用信息 → 服務端 Skeleton HelloBean_HomeImpl_WLSkeleton
  3. Skeleton 調用邏輯實現 HelloBean_HomeImpl.create()
  4. 第一次 RMI 循環完成。遠程對象:HomeImpl,Stub/Skeleton 配對。

Bean 實例化與 Remote Stub 返回

HelloBean_HomeImpl.create() 內部調用 HelloBean_Impl.ejbCreate() 創建/分配 Bean 實例,並構造 HelloBean_EOImpl_WLStub 序列化返回客戶端。此過程在服務端內部完成,無網絡開銷(HomeImpl 充當 Bean_Impl 的本地代理)。

業務方法調用——第二次 RMI 循環

h.helloWorld();  // 實際調用 HelloBean_EOImpl_WLStub.helloWorld()
  1. 客戶端調用 Remote Stub helloWorld()
  2. Stub 發送信息 → 服務端 Remote Skeleton HelloBean_EOImpl_WLSkeleton
  3. Skeleton 調用邏輯實現 HelloBean_EOImpl.helloWorld()
  4. 第二次 RMI 循環完成。遠程對象:EOImpl,Stub/Skeleton 配對。

最終觸達用戶業務代碼

HelloBean_EOImpl.helloWorld() 內部調用 HelloBean_Impl.helloWorld() —— 這才是開發者編寫的業務邏輯!
調用鏈總結:

Client Stub → Network → Server Skeleton → Server Impl → (Local Proxy) → Bean Impl → User Code

關鍵類職責對照表

階段遠程對象接口Client StubServer SkeletonServer Impl
JNDI LookupHomeImplHelloHomeHomeImpl_WLStubHomeImpl_WLSkeletonHomeImpl
create()HomeImplHelloHomeHomeImpl_WLStubHomeImpl_WLSkeletonHomeImpl
Business MethodEOImplHelloEOImpl_WLStubEOImpl_WLSkeletonEOImpl → Bean_Impl

客戶端視角總結

  • 代碼中操作接口 (HelloHome, Hello)
  • 運行時實際操作 Stub (HomeImpl_WLStub, EOImpl_WLStub)
  • Stub 由服務端動態下發,客戶端無需預置 Stub 類文件
  • 兩次完整 RMI 循環完成一次 EJB 業務調用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved