前两天在这个版块的精华区里翻到了罗宾关于EJB的调用原理的分析,受益非浅,但感觉用纯文字来表达效果似乎不够直观,而且对RMI的阐述也略嫌少了些。这里我根据自己的一点体会,在罗宾帖子的基础上再来说说这个话题,供大家参考。
首先,我想先说说RMI的工作原理,因为EJB毕竟是基于RMI的嘛。废话就不多讲了,RMI的本质就是实现在不同的JVM之间的调用,工作原理图如下:
它的实现方法就是在两个JVM中各开一个存根和骨架,二者通过插座通信来实现参数和返回值的传递。
有关RMI的例子代码网上可以找到不少,但绝大部分都是通过java.rmi扩展接口。远程实现,已经封装的很完善了,不免使人有雾里看花的感觉。下面的例子是我在《Enterprise javabean》里看到的,虽然很粗糙,但很直观,利于很快了解它的工作原理。
[@more@]1。定义一个人的接口,其中有两个业务方法,getAge()和getName ()
xanada 2004-03-24 09:53先来看看客户端的程序是怎么写的:
xanada 2004-03-24 10:08好的,现在我们得到了对象instanceOf _UserService_Stub,并实现了UserService
现在我们的客户端走到第三步了:
用户信息ui=object.getUserInfo (userId);
继续看代码,开始第二个RMI循环:
1。调用object.getUserInfo ()
xanada 2004-03-24 19回顾一下上面的分析,可以很清晰的看到两次RMI循环的过程,下图(见链接)描述了整个流程:http://www.pbase.com/image/27229257
黄色的1、6、10是程序员要写的,其余是系统生成的。
# 1是主接口,# 2和# 4都实现了它。
# 6是远程接口,# 7和9 #都实现了它。
# 10是豆实现。
写到这里,基本要说的就说完了。这实在是一项累死人的工作,希望您能稀饭。欢迎补充,欢迎摘错。谢谢,呵呵。
庄表伟2004-03-24 11了不起的工作!
不辞辛劳,详尽明白。
一定会好好学习的!
另外,有没有可能分析一下,这样的工作方式的“所以然”。或者说“不得不然”。再或者有没有“其他的实现方式”。
xanada 2004-03-25 11:18简单讲,就是为了适应分布式开发的需要。
首先,回到我最后给出的流程图。
客户端最原始的冲动,肯定是能直接调用# 10。UserServiceBean就爽了。那么第一个问题来了,
客户端和服务器不在一个JVM里。
这好办,我们不是有RMI吗,好,这个问题就这么解决了:
1。UserServiceBeanInterface.getUserInfo ()
2。UserServiceBeanStub
3。UserServiceBeanSkeleton
4。UserServiceBean
用着用着,第二个问题来了,
UserServiceBean只有人用,没人管理、事务逻辑,安全逻辑,bean实例池逻辑这些不得不考虑的问题浮出水面了。
好的,我们想到用一个委托,EJBObject,来进行所有这些逻辑的管理.client和EJBObject打交道,EJBObject调用UserServiceBean。
注意,这个EJBObject也是一个接口,# 6。UserService这个接口正是从它延伸而来,并且EJBObject所管理的这些逻辑,正是真正的一部分。
现在的流程变为了:
EJBObject
1。UserService.getUserInfo ()
2。UserServiceStub
3。UserServiceSkeleton
4。UserServiceImp
5。UserServiceBean
这已经和整幅图里的# 6 # 7 # 8 # 9 # 10一一对应了。
现在能满足我们的需求了吗?不,第三个问题又来了:
既然是分布式开发,那么我当然没理由只用一个指定的服务器,我可能需要用到好几个不同的服务器,而且EJBObject也需要管理呀
好的,为了适应你的需要,我们还得加再一个HomeObject,首先它来决定用哪个服务器(当然,是由你用JNDI字符串设定的),其次,它来管理EJBObject。
注意,这个EJBHome也是一个接口,# 1。UserServiceHome这个接口正是从它延伸而来,并且EJBHome管理EJBObject的逻辑,也是真正的一部分。
现在的调用次序是
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的调用确实很麻烦,但是搞的这么麻烦,确实是有搞的麻烦的道理,实在是不得不为也。