首页 > 代码库 > 深入了解EJB (三)EJB是什么以及规范之间的内在联系

深入了解EJB (三)EJB是什么以及规范之间的内在联系

       J2EE是一个很大的概念它主要包括了十三个技术规范,除了这十三个外还有一些其他一些规范但不太重要不需要关注,每个规范如果深入研究的话都包括了很多内容,这里不是逐一分析每一个规范的含义,只是谈谈J2EE规范里面几个规范的作用和对企业级开发的一点点理解,如有不恰当支持请指正。

       十三个规范的核心是EJB(enterprise java bean),因此有必要重点分析一下ejb规范,以前ejb还没有向今天这么辉煌时,ejb1.0问世的时候里面仅仅有ejb、rmi等几个简单规范,也仅仅解决了当时分布式应用问题访问问题,其他如事务JTA、JAF等都是后来版本中逐渐加入,让我们一起来看一下如今的ejb规范。

      优势

       专注于业务逻辑

       ejb如果说大了它是一种可以开发大规模企业应用的组件体系结构,它让应用或系统开发者集中精力去开发解决各种复杂业务逻辑问题,而不用花费精力来处理分布式服务器、远程调用等底层技术,ejb的出现可以避免底层技术的重复开发,从而提高开发效率。

       移植性好

       ejb即是一个规范也是一个产品,开发时只要我们遵循ejb规范,开发出来的类或组件可以部署在任何一个支持ejb规范的服务器上,比如bea 的weblogic服务器、ibm的websphere、jboss等服务器都可以部署ejb组件,服务器的移植性很好,这样一来我们可以把ejb组件部署的两台不同的服务器上让他们自己进行交互。

       EJB=RMI+JMS+JNDI

       这个公式觉的可表明它们之间的关系,这个从实现的依赖关系角度出发得出,ejb要依赖于后面的几种技术。

       stateful session bean and stateless session bean

       实现EJB的功能是以后面的几个技术作为基础支撑才让ejb有如此强大的功能。

       ejb分为了两种bean,一种是会话session bean另一种是mdb bean,session bean又分为有状态的session bean和无状态的session bean,有状态的session bean 会使用一个或者多个实例变量来保存而无状态的session bean不能够保存用户信息,在用户操作之后会丢失以前的操作记录,比如购物网站的购物用户如果将要买的商品加入到购物车之后,退出重新登录,重新与服务器之间建立连接,那么用户之前浏览过的信息或者填写的数据将丢失,这就是有状态与无状态会话bean的主要区别。

       rmi 与 对象序列化

       rmi通信使用标准的stub、skeleton机制,远程对象的stub充当远程对象的本地代理,调用程序将调用本地stub方法,而stub方法负责调用远程对象的方法,stub对象具有的接口同远程对象的接口一样。

       

      rmi调用同socket编程区别

        第一、.RMI是面向对象的,而后者不是。
        第二、.RMI是与语言相绑定的。
       第三、从网络协议栈的观点来看,RMI与socket的网络编程处于不同层次上。
       第四、就是两种方法的性能比较,同带宽同数据,socket性能比rmi好一些。

       Socket与RMI比较:http://blog.csdn.net/liuxuezong/article/details/6256549

       有状态session bean实现分布式远程调用基础是rmi,rmi意思是远程调用可以调用远程对象的方法,rmi是纯java编写仅仅支持javaj环境下远程调用,并不能跨平台,rmi调用是依赖于对象序列化,对象序列化是将对象状态转化为字节流又从字节流转为对象的过程,另一端接受到字节流后可以通过java.io里面的字节流类将流转化为对象或文件保存在磁盘上,完成一次远程调用,调用的结果同样会以序列化的方式传回给调用端。

       java.io操作和对象序列化都是java基础里面的内容,可见掌握基础非常重要如果不懂基础这些你都实现不了的,如果想了解基础的同仁可以找一本书系统的学习一下,脑海中浮现出了几句话“多么牛逼的技术都是建立在基础之上”,”万丈高楼平地起“,说的还是很有道理的。

       同样牛逼的技术和底层基础之间有着各种关联,知道了它们之间的联系会在大脑里面形成一张图,让你掌握的技术更加牢固老师说记是记不住,分析每个技术之间的关系会让你体会的更加深刻。


       rmi与jndi

       jndi的作用很简单就是为对象起一个名字,而应用程序可以就可以通过该名字来获取对应的对象。

        1.客户端代码通过jndi来查找ejb,远程方法调用rmi也要通过jndi来访问远程服务对象。

       rmi的服务器端需要将将服务通过jndi绑定,将服务暴露出来供客户端查找,客户端也是通过jndi命名服务来查找对象,进而调用远程对象的方法。

       MDB=EJB+JMS

       JM是为了达到这样的效果一个ejb组件或类将jms消息发送到指定消息目的,另一个组件读取并接受消息内容,这样就实现了两个组件之间的通信,通信的两个组件之间不需要知道对方的存在,这就是jms规范要实现的效果。

       

       我们人为的给ejb bean整合jms服务,既可以得到mdb bean(消息驱动bean),也存在于ejb容器里面可以利用ejb提供的系统服务,如事务、安全和并发控制等等,只是消息bean只负责处理消息,不同客户端打交道。

       消息驱动bean可以看作是rmi调用的补充,rmi调用是同步调用基于对象,调用一个远程方法之后不能继续执行本地方法需要等待返回结果才能继续往下执行,而mdb利用jms消息服务器通信,支持点对点的异步通信方式和发布订阅模式两种模式。

       mdb与ejb区别

       到这里你是否对mdb与ejb有点迷糊了,我们分析一下它们各自的适用场景和区别。

       mdb是由无状态的session bean变化而来的,在用法上他们有些类似,例如他们都是无状态的都不会保存客户端的调用状态,它们可以被多个客户端共享,他们都是应用程序的业务逻辑组件,那么什么时候使用无状态session bean、什么时候使用mdb bean呢?

       无状态的session bean提供了业务接口,客户端需要同步方式调用无状态无状态session bean,而mdb bean客户端不能直接调用,它只是相当于一个消息消费者。

       mdb应用场合:1.业务方法处理时间比较长,而且处理时间可能具有不确定性 2.客户端调用该方法后无需立即得到返回结果。

       在一般编程中将无状态的session bean作为业务逻辑组件使用、mdb作为控制器使用,调用过程是;

       消息发送者--->jms消息目的--->触发onMessage()方法--->MDB--->调用业务方法--->session bean。


总结:

       ejb是一种很好的分布式解决方案,笔者喜欢它对各种技术的融合并实现了分布式调用能力,它的设计思想、设计方式值的我们去学习和深入研究,后来的轻量级组合spring+hibernate/springMVC+spring+hibernate等里面有些设计原理可能也是参考了ejb前期的设计规范想出来的,它们摒弃了ejb开发复杂、难度系数大的问题。

       后来ejb3.0、ejb3.1版本都在朝着开发简单、轻量级方向发展,相信ejb功能会优化的更加简单。


深入了解EJB (三)EJB是什么以及规范之间的内在联系