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

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

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

      优点spring

       专一于业务逻辑编程

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

       移植性好服务器

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

       EJB=RMI+JMS+JNDIsession

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

       

       stateful session bean and stateless session beanless

       实现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编程区别

        第1、.RMI是面向对象的,然后者不是。
        第2、.RMI是与语言相绑定的。
       第3、从网络协议栈的观点来看,RMI与socket的网络编程处于不一样层次上。
       第4、就是两种方法的性能比较,同带宽同数据,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功能会优化的更加简单。

相关文章
相关标签/搜索