EJB 工作原理之三:第一个RMI循环

先来看看Client端的程序是怎么写的:

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这一步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值