由于EJB的調用過程對開發者來說是透明的,以至于我們錯誤地認為:lookup()方法傳回的對象就是bean執行個體。實際上,用戶端與Session bean互動,它并不直接與Bean執行個體打交道,而是經由bean的遠端或本地接口。當你調用遠端或本地接口的方法時,接口使用的是存根(stub)對象。該存根實作了session bean的遠端或本地接口。它負責将方法調用經過網絡發送到遠端EJB容器,或将請求路由到位于本地JVM内的EJB容器。存根是在部署期間使用JDK所帶的java.lang.reflect.Proxy動态生成。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZugGMId2M4kDM2cjNxMTMfBzLcNjMvwVOwETMwIzLcRnbl1GajFGd0F2LcRXZu5ibkN3YukGavw1LcpDc0RHaiojIsJye.gif)
第一步:用戶端調用遠端接口的SayHello()方法(實際上調用的是存根對象的SayHello()方法,該存根實作了HelloWorld的遠端接口)。
第二步:方法調用經過IIOPRuntime被轉換成CORBA IIOP消息發往應用伺服器。
第三步:應用伺服器接收到請求消息後,交由骨架(skeleton)處理。骨架通過IIOP Runtime解析協定消息,并根據協定要求調用bean執行個體的SayHello()方法。是以bean執行個體是由骨架進行調用的
第四步:骨架(skeleton)将SayHello()方法的傳回值經過IIOPRuntime轉換成CORBA IIOP應答消息發回用戶端。
第五步:存根對象通過IIOP Runtime将CORBAIIOP應答消息解析成傳回值。