先来看看Client端的程序是怎么写的:
在第一步之后,我们得到了一个UserServiceHome(interface)定义的对象home,那么,home到底是哪个class的instance呢?用debug看一下,知道了home原来就是_UserServiceHome_Stub的实例。
从第二步开始,就是我们的关注所在,虽然只有简单的一行代码,
UserService object = home.create();
但是他背后的系统是怎么运做的呢?我们进入代码来看吧:
1. 调用home.create()
2. 实际是调用_UserServiceHome_Stub.create(),在这个方法里面,Stub向Skeleton发送了一个create的字串:
3. Server端的Skeleton接收Stub发来的request,并调用相应的方法:
4. Skeleton调用的是UserServiceHome的Server端实现类的create方法
5. #4又调用EJSStatelessUserServiceHomeBean_a940aa04.create()
至此,我们终于结束了第一个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这一步。
java代码: |
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()
java代码: |
UserServiceHome home; UserService obj = home. create ( ); |
2. 实际是调用_UserServiceHome_Stub.create(),在这个方法里面,Stub向Skeleton发送了一个create的字串:
java代码: |
org. omg. CORBA. portable. OutputStream out = _request ("create", true ); in = (org. omg. CORBA_ 2_ 3. portable. InputStream )_invoke (out ); |
3. Server端的Skeleton接收Stub发来的request,并调用相应的方法:
java代码: |
_EJSRemoteStatelessUserServiceHome_a940aa04_Tie._invoke ( ) { ...... switch (method. length ( ) ) { case 6: if (method. equals ("create" ) ) { return create (in, reply ); } ...... } } |
java代码: |
_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方法
java代码: |
EJSRemoteStatelessUserServiceHome_a940aa04. create ( ) { UserService _EJS_result; _EJS_result = EJSStatelessUserServiceHomeBean_a940aa04. create ( ); } |
5. #4又调用EJSStatelessUserServiceHomeBean_a940aa04.create()
java代码: |
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这一步。