溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

[轉]EJB 工作原理

發布時間:2020-08-10 05:52:35 來源:ITPUB博客 閱讀:238 作者:kevin_yang 欄目:編程語言

前兩天在這個版塊的精華區里翻到了Robbin關于EJB的調用原理的分析,受益非淺,但感覺用純文字來表達效果似乎不夠直觀,而且對RMI的闡述也略嫌少了些。這里我根據自己的一點體會,在Robbin帖子的基礎上再來說說這個話題,供大家參考。

首先,我想先說說RMI的工作原理,因為EJB畢竟是基于RMI的嘛。廢話就不多講了,RMI的本質就是實現在不同JVM之間的調用,工作原理圖如下:

[轉]EJB 工作原理

它的實現方法就是在兩個JVM中各開一個Stub和Skeleton,二者通過socket通信來實現參數和返回值的傳遞。

有關RMI的例子代碼網上可以找到不少,但絕大部分都是通過extend the interface java.rmi.Remote實現,已經封裝的很完善了,不免使人有霧里看花的感覺。下面的例子是我在《Enterprise JavaBeans》里看到的,雖然很粗糙,但很直觀,利于很快了解它的工作原理。

[@more@]

1. 定義一個Person的接口,其中有兩個business method, getAge() 和getName()

xanada 2004-03-24 09:53

先來看看Client端的程序是怎么寫的:

xanada 2004-03-24 10:08

OK, now we got the object which is instanceOf _UserService_Stub, and implements UserService

現在我們的Client端走到第三步了:
UserInfo ui = object.getUserInfo(userId);

繼續看代碼,開始第二個RMI循環:

1. 調用object.getUserInfo()

xanada 2004-03-24 10:19

回顧一下上面的分析,可以很清晰的看到兩次RMI循環的過程,下圖(見鏈接)描述了整個流程:

http://www.pbase.com/image/27229257

黃色的1,6,10是程序員要寫的,其余是系統生成的。

#1是Home interface, #2和#4都implements 了它。
#6是Remote interface, #7和#9都implements 了它。
#10是Bean實現。

寫到這里,基本要說的就說完了。這實在是一項累死人的工作,希望您能稀飯。歡迎補充,歡迎摘錯。謝謝,呵呵。

莊表偉 2004-03-24 11:02

了不起的工作!
不辭辛勞,詳盡明白。

一定會好好學習的!

另外,有沒有可能分析一下,這樣的工作方式的“所以然”?;蛘哒f“不得不然”。再或者有沒有“其他的實現方式”。

xanada 2004-03-25 11:18

簡單講,就是為了適應分布式開發的需要。

首先,回到我最后給出的流程圖。

Client端最原始的沖動,肯定是能直接調用#10.UserServiceBean就爽了。那么第一個問題來了,
Client和Server不在一個JVM里。

這好辦,我們不是有RMI嗎,好,這個問題就這么解決了:
1. UserServiceBeanInterface.getUserInfo()
2. UserServiceBeanStub
3. UserServiceBeanSkeleton
4. UserServiceBean

用著用著,第二個問題來了,
UserServiceBean只有人用,沒人管理,transaction logic, security logic, bean instance pooling logic這些不得不考慮的問題浮出水面了。

OK,我們想到用一個delegate,EJBObject,來進行所有這些logic的管理。client和EJBObject打交道,EJBObject調用UserServiceBean。

注意,這個EJBObject也是一個Interface,#6.UserService這個interface正是從它extends而來。并且EJBObject所管理的這些logic,正是AppServer的一部分。

現在的流程變為了:
EJBObject
1. UserService.getUserInfo()
2. UserServiceStub
3. UserServiceSkeleton
4. UserServiceImp
5. UserServiceBean

這已經和整幅圖里的#6, #7, #8, #9, #10一一對應了。

現在能滿足我們的需求了嗎?不,第三個問題又來了:
既然是分布式開發,那么我當然沒理由只用一個Specified Server,我可能需要用到好幾個不同的Server,而且EJBObject也需要管理呀

OK,為了適應你的需要,我們還得加再一個HomeObject,首先它來決定用哪個Server(當然,是由你用JNDI String設定的),其次,它來管理EJBObject。

注意,這個EJBHome也是一個Interface,#1.UserServiceHome這個interface正是從它extends而來。并且EJBHome管理EJBObject的logic,也是AppServer的一部分。

現在的調用次序是
1. EJBHome.create()
2. EJBHomeStub
3. EJBHomeSkeleton
4. EJBHomeImp(EJSWrapper)
5. EJSHome

得到EJBObject

6. UserService.getUserInfo()
7. UserServiceStub
8. UserServiceSkeleton
9. UserServiceImp
10. UserServiceBean

現在已經完全和流程圖的調用順序一致了。

綜上所述,EJB的調用確實很麻煩,但是搞的這么麻煩,確實是有搞的麻煩的道理,實在是不得不為也。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女