现在的位置: 首页 > 综合 > 正文

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

2013年12月07日 ⁄ 综合 ⁄ 共 2148字 ⁄ 字号 评论关闭

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

5、最后一个,Client的实现

代码:

public class PersonClient {
public static void main(String [] args) {
try {
Person person = new Person_Stub();
int age = person.getAge();
String name = person.getName();
System.out.println(name + " is " + age + " years old");
} catch(Throwable t) {
t.printStackTrace();
}
}
}

Client的本质是,它要知道Person接口的定义,并实例一个Person_Stub,通过Stub来调用business method,至于Stub怎么去和Server沟通,Client就不用管了。

注意它的写法:

Person person = new Person_Stub();

而不是

Person_Stub person = new Person_Stub(); 

为什么?因为要面向接口编程嘛,呵呵!

//RMI实质上就是生成2个类stub,skeleton来进行参数和返回值的传递,采用值传递方式
//类似于以前写的聊天室程序,被传递的对象应实现java.io.Serializable接口

二、Websphere实现

EJB类一览   

这里结合WebSphere来讲讲各个类的调用关系吧!

假定我们要创建一个读取User信息的SessionBean,需要我们写的有3个文件:

1、UserServiceHome.java

Home接口

2、UserService.java

Remote接口

3、UserServiceBean.java

Bean实现

WSAD最终会生成10个class。其它7个是什么呢?我们一个一个数过来。

4、_UserServiceHome_Stub.java
这个当然就是Home接口在Client端(动态加载)的Stub类了,它implements UserServiceHome。

5、_EJSRemoteStatelessUserServiceHome_a940aa04_Tie.java
Home接口在Server端的Skeleton类,"a940aa04"应该是随机生成的,所有其他的相关class名里都会有这个标志串,Tie是Corba对Skeleton的叫法。

6、EJSRemoteStatelessUserServiceHome_a940aa04.java
Home接口在Server端的实现,当然,它也implements UserServiceHome。

7、EJSStatelessUserServiceHomeBean_a940aa04.java
由#6调用,create _UserService_Stub。(为什么#6不能直接create _UserService_Stub呢?后面再讲。)

8、_UserService_Stub.java
Remote接口在Client端(动态加载)的Stub类。它implements UserService。

9、_EJSRemoteStatelessUserService_a940aa04_Tie.java
Remote接口在Server端的Skeleton类。

10、EJSRemoteStatelessUserService_a940aa04.java
Remote接口在Server端的实现,当然,它也implements UserService。并且,它负责调用UserServiceBean——也就是我们所写的Bean实现类——里面的business method。

那么,各个类之间的调用关系到底是怎么样的呢?简单的说,就是两次RMI循环。   

第一个RMI循环   

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

代码:

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的实例。

抱歉!评论已关闭.