从第二步开始,就是我们的关注所在,虽然只有简单的一行代码,
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;
}
|