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

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

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);

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这一步。

第二个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()

代码:

UserService object; 
object.getUserInfo(userId);

2、实际是调用_UserService_Stub.getUserInfo(int arg0),在这个方法里面,Stub向Skeleton发送了一个getUserInfo的字串和arg0这个参数:

代码:

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

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

代码:

_EJSRemoteStatelessUserService_a940aa04_Tie._invoke() {
switch (method.charAt(5))
{
case 83:
if (method.equals("getUserInfo")) {
return getUserInfo(in, reply);
}
......
}
}

_EJSRemoteStatelessUserService_a940aa04_Tie.getUserInfo() {
EJSRemoteStatelessUserService_a940aa04 target = null;
int arg0 = in.read_long();
UserDTO result = target.getUserInfo(arg0);
org.omg.CORBA_2_3.portable.OutputStream out = reply.createReply();
out.write_value(result,UserDTO.class);
return out;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值