快速业务通道

EJB的存根和骨架的工作原理 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
当然,它也implements UserService。并且,它负责调用UserServiceBean——也就是我们所写的Bean实现类——里面的business method。

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

EJB的存根和骨架的工作原理(6)

时间:2011-04-30

第一个RMI循环  

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

代码:

try { InitialContext ctx = new InitialContext(); //第一步 UserServiceHome home = (UserServiceHome) PortableRemoteObject.narrow( ctx.lookup(JNDIString), UserServiceHome.class); //home: _UserServiceHome_Stub System.out.println(home.toString()); //第二步 UserService object = home.create(); //ojbect: _UserService_Stub System.out.println(object.toString()); //第三步 int userId = 1; UserInfo ui = object.getUserInfo(userId); }

在第一步之后,我们得到了一个UserServiceHome(interface)定义的对象home,那么,home到底是哪个class的instance呢?用debug看一下,知道了home原来就是_UserServiceHome_Stub的实例。

从第二步开始,就是我们的关注所在,虽然只有简单的一行代码,

UserService object = home.create();

但是他背后的系统是怎么运做的呢?我们进入代码来看吧!

1、调用home.create()

代码:

UserServiceHome home; UserService obj = home.create();

2、实际是调用_UserServiceHome_Stub.create(),在这个方法里面,Stub向Skeleton发送了一个create的字串:

代码:

org.omg.CORBA.portable.OutputStream out = _request("create", true); in = (org.omg.CORBA_2_3.portable.InputStream)_invoke(out);

EJB的存根和骨架的工作原理(7)

时间:2011-04-30

3、Server端的Skeleton接收Stub发来的request,并调用相应的方法:

代码:

_EJSRemoteStatelessUserServiceHome_a940aa04_Tie._invoke() { ...... switch (method.length()) { case 6: if (method.equals("create")) { return create(in, reply); } ...... } }

代码:

_EJSRemoteStatelessUserServiceHome_a940aa04_Tie.create() { EJSRemoteStatelessUserServiceHome_a940aa04 target = null; result = target.create(); org.omg.CORBA.portable.OutputStream out = reply.createReply(); Util.writeRemoteObject(out,result); return out; }

4、Skeleton调用的是UserServiceHome的Server端实现类的create方法

代码:

EJSRemoteStatelessUserServiceHome_a940aa04.create() { UserService _EJS_result; _EJS_result = EJSStatelessUserServiceHomeBean_a940aa04.create(); }

5、#4又调用EJSStatelessUserServiceHomeBean_a940aa04.create()

代码:

UserService result = super.createWrapper(new BeanId(this, null));

至此,我们终于结束了第一个RMI循环,并得到了Remote接口UserService的Stub类_UserService_Stub,就是#5里面的result。

这里有一个问题,为什么#4不直接create _UserService_Stub,而又转了一道#5的手呢?因为#4 extends from

EJSWrapper,它没有能力create Stub,因此必须借助#5,which extends from EJSHome,这样才可以生成一个Stub。如果不是为了生成这个Stub,应该可以不走#5这一步。

EJB的存根和骨架的工作原理(8)

时间:2011-04-30

第二个RMI循环

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

现在我们的Client端走到第三步了:

UserInfo ui = object.getUserInfo(userId);

继续看代码,开始第二个RMI循环:

1、调用object.getUserInfo()

代码

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号