OK, now we got the object which is instanceOf _UserService_Stub, and implements UserService
现在我们的Client端走到第三步了:
UserInfo ui = object.getUserInfo(userId);
继续看代码,开始第二个RMI循环:
1. 调用object.getUserInfo()
2. 实际是调用_UserService_Stub.getUserInfo(int arg0),在这个方法里面,Stub向Skeleton发送了一个getUserInfo的字串和arg0这个参数:
3. Server端的Skeleton接收Stub发来的request,并调用相应的方法:
4. Skeleton调用的是UserService的Server端实现类的getUserInfo方法
现在我们的Client端走到第三步了:
UserInfo ui = object.getUserInfo(userId);
继续看代码,开始第二个RMI循环:
1. 调用object.getUserInfo()
java代码: |
UserService object; object. getUserInfo (userId ); |
2. 实际是调用_UserService_Stub.getUserInfo(int arg0),在这个方法里面,Stub向Skeleton发送了一个getUserInfo的字串和arg0这个参数:
java代码: |
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,并调用相应的方法:
java代码: |
_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; } |
4. Skeleton调用的是UserService的Server端实现类的getUserInfo方法
java代码: |
EJSRemoteStatelessUserService_a940aa04. getUserInfo ( ) { UserServiceBean _EJS_beanRef = container. preInvoke (this, 0, _EJS_s ); _EJS_result = _EJS_beanRef. getUserInfo (id ); } |
最后的最后,#4终于调用了我们写的UserServiceBean里的getUserInfo方法,这才是我们真正想要去做的事情。
至此,第二个RMI循环也终于结束了。
回顾一下上面的分析,可以很清晰的看到两次RMI循环的过程,下图(见链接)描述了整个流程:
http://www.pbase.com/image/27229257
黄色的1,6,10是程序员要写的,其余是系统生成的。
#1是Home interface, #2和#4都implements 了它。
#6是Remote interface, #7和#9都implements 了它。
#10是Bean实现。
写到这里,基本要说的就说完了。这实在是一项累死人的工作,希望您能稀饭。欢迎补充,欢迎摘错。谢谢,呵呵。