从第二步开始,就是我们的关注所在,虽然只有简单的一行代码,
UserService object = home.create(); |
但是他背后的系统是怎么运做的呢?我们进入代码来看吧!
1、调用home.create()
代码:
UserServiceHome home; |
2、实际是调用_UserServiceHome_Stub.create(),在这个方法里面,Stub向Skeleton发送了一个create的字串:
代码:
org.omg.CORBA.portable.OutputStream out = _request("create", true); |
3、Server端的Skeleton接收Stub发来的request,并调用相应的方法:
代码:
|
代码:
|
4、Skeleton调用的是UserServiceHome的Server端实现类的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; |
2、实际是调用_UserService_Stub.getUserInfo(int arg0),在这个方法里面,Stub向Skeleton发送了一个getUserInfo的字串和arg0这个参数:
代码:
org.omg.CORBA.portable.OutputStream out = _request("getUserInfo", true); |
3、Server端的Skeleton接收Stub发来的request,并调用相应的方法:
代码:
|