1. 简介
我们知道Ejb的客户端仅通过业务逻辑Bean所定义的接口来访问业务逻辑,跟具体实现无关。
当在开发企业Bean之前,首先要做的第一个决定是,EJB要支持什么样的客户端?因为不同的客户端,其访问方式也将不同,对Ejb的注解也将不同。
Ejb支持的客户端有如下几种类型:
Ø 本地客户端(客户端与其调用的Ejb对象在同一个JVM进程中)
Ø 远程客户端(客户端与其调用的Ejb对象不在同一个JVM进程中)
Ø WebService客户端
Ejb的访问方式有如下几种类型:
Ø Local(本地访问)方式
Ø Remote(远程访问)方式
Ø WebMethod方式
客户端类型与访问方式类型的对应关系如下:
其中本地客户端,即可以采用“Local(本地)”访问方式,也可以采用“Remote(远程)”访问方式。;而远程客户端只能采用Remote(远程)”访问方式;WebService客户端只能采用WebMethod访问方式。
Web service客户端可以访问无状态会话Bean的接口,只有在业务逻辑方法被标识为@WebMethod的时候,web service客户端才可以访问到!下面主要介绍,Remote、Local两种访问方式与“远程客户端”、“本地客户端“。
2. 两种访问方式
2.1 远程访问(调用)方式(Remote Access)
当客户端与Ejb不在同一个JVM进程中时(一个进程代表一个独立的内存空间,两个进程之间是不能通过普通的方式进行调用的,可以通过底层网络通信例如,Socket来沟通),就需要远程访问方式。
需要注意,远程方式,客户端与服务器之间通信的时候,数据(参数、返回值)需要序列化,而且要用传值(Copy一份)的方式进行传输。调用过程如下图:
2.2 本地访问方式(Local Access)
由于客户端与其调用的Ejb对象在同一个JVM进程中,所以客户端与服务器之间通信的时候,直接调用即可,不需要底层的网络通信。所以,数据(参数、返回值)不需要序列化,而且直接用传址(引用)的方式进行传输。调用过程如下:
3. 两种客户端
3.1 本地客户端(Local Client)
一个本地客户端具有如下特性:
Ø 它必须与企业Bean运行在同一个JVM中。(即,需要与Ejb部署到同一服务器中)
Ø 它可能是一个web组件或别的企业Bean。
Ø 为了创建一个能够被本地访问的企业Bean,你必须用@Local注解来定义这些企业Bean。
Ø 本地客户端,不需要添加EJB3_CLIENT 下的jar包,因为运行时JBoss会自动将这些东西放到客户端的目录下。
注意:一个企业Bean接口可以同时被定义为@Remote和@Local。
本地客户端,既可以通过Local方式访问企业Bean,也可以通过Remote方式方法企业Bean。
3.2 远程客户端(Remote Client)
一个远程客户端具有如下特性:
Ø 它可以运行在跟企业Bean不同的机器或不同的JVM进程上
Ø 它可以是web组件、应用客户端、或其它的企业Bean
Ø 对远程客户端来说,企业Bean的位置是透明的
Ø 为了创建一个能够被远程客户端访问的企业Bean,你必须用@Remote注解来定义这些企业Bean。
注:远程客户端只能通过Remote方式来访问企业Bean。
4. 总结
因为不同的客户端,其访问方式也将不同。所以,在开发企业Bean之前,首先要做的第一个决定是,EJB要支持什么样的客户端。上面主要介绍了两种客户端、两种客户端访问Ejb的方式。下面是对两者的一个简单对比:
不同的访问方式(Remote、Local、web service),会影响到Bean方法的参数及其返回值。如果是远程调用,客户端操纵的Bean的参数,其实是一份参数值的拷贝。因此,对参数的修改,不会影响到Bean。但是对于本地调用来说,客户端操纵的Bean的参数,就是一个引用,它对参数的修改,将会影响到Bean。所以,不管在哪种情况下,请避免修改参数的值!
因为远程调用的速度比较慢,所以在设计的时候,请尽量使用粗粒度的接口设计。即尽量减少方法的调用,并尽可能在一次方法调用中传输完毕所需要的数据!