科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道EJB的存根和骨架的工作原理

EJB的存根和骨架的工作原理

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文是作者对EJB工作原理的学习笔记,包括有RMI工作原理、Websphere实现、Weblogic实现和自己总结的理解体会,供大家参考!

作者:佚名 来源:Csdn 2007年11月18日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共5页)

从第二步开始,就是我们的关注所在,虽然只有简单的一行代码,

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

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章