→阿童沐

財富==支撐一個人生存多長時間的能力!

导航

<尚学堂><EJB> 3-EJB客户端及访问方式原理

定义客户端访问接口:

1. 客户端仅通过业务逻辑Bean所定义的接口来访问业务逻辑(跟具体实现无关);

2. 当开发企业Bean之前, 首先要做的第一个决定是: EJB要支持什么样的客户端? 因为不同的客户端, 其访问的方式也将不同(分布式开发对于性能的要求很重要)。【三-10:00

  1> 远程客户端;  - 客户端与其调用的EJB对象不在同一个JVM进程中。(场景:这个是远程客户端的本质)

  2> 本地客户端;  - 客户端与其调用的EJB对象在同一个JVM进程中。(场景:启动一个JBoss服务器, 然后在服务器中放入两个EJB对象,其中一个EJB作为客户端, 另外一个EJB作为服务器端即可 & 或在部署JBoss服务器的时候, 服务器中即部署了一个EJB, 也部署了一个Servlet, EJB作为服务器端, Servlet作为客户端, 这样就是两个组件放于一个进程中)

  3> WebService客户端.


关于客户端的概念:

  客户端是相对于EJB而言。

  客户端有可能是一下几种情况:

  1> JSP & Servlet;

  2> Application Client;

  3> 另外的EJB(EJB调用EJB也是可以的).

 


3. 关于JVM进程的问题:    【三-05:00】

  1> 假设在同一台机器上,安装了一个JVM, 一个JBoss应用服务器;

    1. 启动JBoss应用服务器(启动JBoss应用服务器的时候要用到JVM);

    2. 另外编写一个包含main方法的Java类,并编译以及运行(要运行这个程序当然也要用到JVM);

    问题:在运行这个Java类的时刻, 这台机器上有多少个JVM进程? 答案: 实际上是两个JVM进程.

    扩展开来说,在某一个JVM进程中new的对象,在另外一个JVM进程中是无法直接进行调用的。但是可以进行间接的通信, 比如:通过Socket进行连接。


远程客户端(Remote Client)

    一个远程客户端具有如下特性:

  1. 它可以运行在跟企业Bean不同的机器上或不同的JVM进程上;

  2. 它可以是web组件、应用客户端、或其他的企业Bean;

  3. 对远程客户端来说, 企业Bean的位置是透明的(通过配置文件来完成);

  4. 为了创建一个能够被远程客户端访问的企业Bean, 你必须用@Remote注解来定义这些企业Bean。

本地客户端(Local Client)

  一个本地客户端具有如下特性:

  1. 它必须与企业Bean运行在同一个JVM进程中;

  2. 它可能是一个web组件或别的企业Bean;

  3. 为了创建一个能够被本地访问的企业Bean, 你必须用@Local注解来定义这些企业Bean;

  4. 一个企业Bean接口可以同时被定义为@Remote@Local


 

远程访问(调用)方式(Remote Access)    【三-15:00】

在远程方法调用的时候, 底层机制还是通过Socket进行通信, 使用场景是在两个JVM进程之间进行通信。

在通过Socket进行通信的时候, 如果需要发送对象数据, 则必须将对象实现Serializable接口, 否则无法发送出去, 即发送之前必须对对象进行序列化。

注意:在服务端EJB中改变参数对象的值, 在客户端是看不到参数状态的改变的。

有关对象序列化注意事项: 【三-18:00】

 

本地访问方式(Local Access)    【三-19:00】

本地客户端访问之所以不同是i因为,本地客户端的对象与服务端的对象在一个JVM进程之中,那么参数对象的传递就是直接传递到目标对象的方法中(对象的引用传递进去),而不需要对参数对象进行序列化和反序列化操作了;

注意:与远程访问方式相对应, 在服务端EJB中修改参数对象的信息, 在本地客户端中是能够看到其中改变的。


 

客户端与访问方式:

远程客户端只能通过远程访问方式来访问;

而本地客户端技能通过远程访问方式来访问也能通过本地访问方式来访问。


 

关于Webservice客户端:

  WebService客户端可以访问无状态Stateless Session Bean的接口,但是不能访问有状态 Stateful Session Bean的接口, 只有在业务逻辑方法被标识为@WebMethod的时候, web service客户端才可以访问到。


 

方法的参数和访问方式:    【三-24:00】

  不同的访问方式(Remote,Local,Web Service),会影响到Bean方法的参数及其返回值;

一、独立性:

  如果是远程调用,客户端操纵的参数Bean,其实只是一份参数对象的拷贝。因此,对参数的改变,不会影响到服务器端的参数Bean。

  但是对于本地调用来说,客户端操纵的Bean的参数,就是一个Bean的引用,它对参数的修改将会直接影响到服务器端的Bean。

  所以,不管在哪种情况下,请避免修改参数的值。如果想要获得传入参数的改变后的状态, 不要依赖于参数, 而是通过返回值的方式返回给客户端方式来获得。    【三-25:45】

  这里的独立性的意思是,不管是客户端是作为远程客户端还是作为本地客户端, 不能因为调用方式的改变,逻辑部分需要发生改变。

二、粗粒度的数据访问:

  因为远程调用的速度比较慢(例如:建立Socket连接、参数对象的序列化与反序列化,这些操作都是非常慢的),所以在系统设计的时候,请尽量使用粗粒度的接口设计。即尽量减少方法的调用,并尽可能在一次方法调用中传输完毕所需要的数据。即方法或接口的设计需要粗粒度的设计(即,尽量减少远程方法调用的次数,减少开销)          【三-26:30】

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2012-11-18 19:48  阿童沐  阅读(928)  评论(0)    收藏  举报