首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

EJB 调用原理及缘故

2012-09-10 
EJB 调用原理及原因这里就结合WebSphere来讲讲各个类的调用关系吧。假定我们要创建一个读取User信息的Sessi

EJB 调用原理及原因

这里就结合WebSphere来讲讲各个类的调用关系吧。

假定我们要创建一个读取User信息的SessionBean,需要我们写的有3个文件:
1. UserServiceHome.java
Home接口

2. UserService.java
Remote接口

3. UserServiceBean.java
Bean实现

WSAD最终会生成10个class。其它7个是什么呢?我们一个一个数过来:

4. _UserServiceHome_Stub.java
这个当然就是Home接口在Client端(动态加载)的Stub类了,它implements UserServiceHome。

5. _EJSRemoteStatelessUserServiceHome_a940aa04_Tie.java
Home接口在Server端的Skeleton类,"a940aa04"应该是随机生成的,所有其他的相关class名里都会有这个标志串,Tie是Corba对Skeleton的叫法。

6. EJSRemoteStatelessUserServiceHome_a940aa04.java
Home接口在Server端的实现,当然,它也implements UserServiceHome。

7. EJSStatelessUserServiceHomeBean_a940aa04.java
由#6调用,create _UserService_Stub。(为什么#6不能直接create _UserService_Stub呢?后面再讲。)

8. _UserService_Stub.java
Remote接口在Client端(动态加载)的Stub类。它implements UserService。

9. _EJSRemoteStatelessUserService_a940aa04_Tie.java
Remote接口在Server端的Skeleton类。

10. EJSRemoteStatelessUserService_a940aa04.java
Remote接口在Server端的实现,当然,它也implements UserService。并且,它负责调用UserServiceBean——也就是我们所写的Bean实现类——里面的business method。

那么,各个类之间的调用关系到底是怎么样的呢?简单的说,就是两次RMI循环。

?

先来看看Client端的程序是怎么写的:

                        EJSRemoteStatelessUserService_a940aa04.getUserInfo();?{??????UserServiceBean?_EJS_beanRef?=?container.preInvoke(this,?0,?_EJS_s);;??????_EJS_result?=?_EJS_beanRef.getUserInfo(id);;??}??



                      最后的最后,#4终于调用了我们写的UserServiceBean里的getUserInfo方法,这才是我们真正想要去做的事情。

                      至此,第二个RMI循环也终于结束了。

                      ?

                      回顾一下上面的分析,可以很清晰的看到两次RMI循环的过程,下图(见链接)描述了整个流程:

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

                      黄色的1,6,10是程序员要写的,其余是系统生成的。

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

                      ?

                      ?

                      ?

                      why?????

                      简单讲,就是为了适应分布式开发的需要。

                      首先,回到我最后给出的流程图。

                      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的调用确实很麻烦,但是搞的这么麻烦,确实是有搞的麻烦的道理,实在是不得不为也。

热点排行