您的位置:首页 > 其它

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

2009-01-25 00:31 330 查看
从第二步开始,就是我们的关注所在,虽然只有简单的一行代码,

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: