深入理解Enterprise JavaBean的Local调用问题

原创 2004年10月01日 09:22:00
*为EJB实现本地接口
本地接口是EJB 2.0规范新增的内容,它使得Bean能够避免远程调用的开销。请考虑下面的代码。
TestBeanHome home = (TestBeanHome)
javax.rmi.PortableRemoteObject.narrow(ctx.lookup ("TestBeanHome"), TestBeanHome.class);
TestBean bean = (TestBean)
javax.rmi.PortableRemoteObject.narrow
(home.create(), TestBean.class);
第一个语句表示我们要寻找Bean的Home接口。这个查找通过JNDI进行,它是一个RMI调用。然后,我们定位远程对象,返回代理引用,这也是一个RMI调用。第二个语句示范了如何创建一个实例,涉及了创建IIOP请求并在网络上传输请求的stub程序,它也是一个RMI调用。
要实现本地接口,我们必须作如下修改:
方法不能再抛出java.rmi.RemoteException异常,包括从RemoteException派生的异常,比如TransactionRequiredException、TransactionRolledBackException和NoSuchObjectException。EJB提供了等价的本地异常,如TransactionRequiredLocalException、TransactionRolledBackLocalException和NoSuchObjectLocalException。
所有数据和返回值都通过引用的方式传递,而不是传递值。
本地接口必须在EJB部署的机器上使用。简而言之,客户程序和提供服务的组件必须在同一个JVM上运行。
如果Bean实现了本地接口,则其引用不可串行化。

*用本地引用提高EJB访问效率

EJB 1.0和1.1规范只定义了一种在EJB组件中引用另一组件的方法,即通过Bean的远程接口。如果两个Bean都在同一个容器之内,则这种网络开销是不必要的。为解决这个问题,EJB 2.0规范定义了一种新的EJB引用类型,即本地引用。
一、 两种引用类型
为了从其他EJB组件访问某个Bean,容器提供了一种特殊的机制。这种机制允许一个Bean提供者通过称为EJB引用的“逻辑名字”引用另一个EJB的Home。EJB容器利用应用的部署描述器为EJB构造环境,而这些引用在部署描述器中作为特殊的项目声明。在部署描述器中,部署者把组件代码中要用到的EJB引用绑定到其他被引用EJB的Home。

如前所述,在EJB 2.0规范出现之前,在一个EJB中引用其他Bean只有一种方法,即通过远程接口,它要求进行跨越网络的远程过程调用。如果某个事务由多个Bean协作完成,通过网络进行多个对象的汇集和释放将是一项相当繁重的工作。

EJB 2.0规范新增了一种本地接口类型,允许在同一容器之内的Bean直接互相引用,避免了远程接口的网络开销。本地接口是一种标准的Java接口,而不是从RMI继承得到。EJB组件的定义可以包含本地接口或远程接口,或者两者都定义。
本地引用的指定方式和传统的远程引用一样,即在部署描述器中指定。事实上,本地引用的部署描述元素与远程引用的描述元素完全对应。

二、 创建本地接口,通过本地接口访问EJB
要把一个现有的远程接口改为本地接口,有三个地方必须修改:部署描述器,Bean的接口,以及对EJB的调用。前面我们介绍了如何通过部署描述器指定一个本地引用,现在我们要把远程接口转换成本地接口,然后修改JNDI查找调用,让它使用新的本地接口。

Home接口

指定Home接口时,现在必须导入的是“javax.ejb.EJBLocalHome”,而不是“javax.ejb.EJBHome”。接口的声明也必须改变,让它从“EJBLocalHome”(一个标准Java接口)继承,而不是从“EJBHome”(一个RMI接口)继承。同时,从该接口定义的方法中唯一应该抛出的异常是javax.ejb.CreateException,而java.rmi.RemoteException异常则不再必要。

本地接口

指定本地接口时,现在必须导入“javax.ejb.EJBLocalObject”,而不是“javax.ejb.EJBObject”。接口声明也必须改变,让它从“EJBLocalObject”(一个本地接口)继承,而不是从“EJBObject”(一个RMI接口)继承。

执行调用

创建好接口、设置好部署描述器之后,剩下的工作就是执行JNDI调用,查找对其他EJB的引用。调用Bean的远程接口时,javax.rmi.PortableRemoteObject的“narrow()”方法汇集经过RMI的调用。对于本地引用,这种开销就不再必要,这时只需简单地进行JNDI查找并进行适当的类型定型。下面是一个例子:
home = (ProductHome) initCtx.lookup("java:comp/env/ejb/Product");

它不仅提高了效率,而且代码也比用来获取远程接口的代码更直观易懂。
本地接口使得处于同一容器内的两个EJB组件能够更高效地进行通信。对于实体Bean的应用来说,这种技术尤其有用,因为与客户程序直接访问实体Bean相比,在实践中,通过会话Bean访问实体Bean得到了更广泛的认可。
如果你准备使用本地引用,请先检查自己的应用服务器平台是否支持它。也许,在EJB 2.0规范获得广泛应用之前,我们还得等待一段时间。

*总结:
1、远程接口是通过损失执行性能已获得分布式EJB的能力,本地接口是以禁止分布式EJB的代价来获得良好的执行性能。


2、调用EJB 本地接口的JSP 或Servlet 所属的WAR 必须与EJB JAR 统一打包到EAR
文件中去。当该EAR 被部署到WebLogic,JSP 或Servlet 才能调用EJB 的本地接口。
如果WAR 和JAR 单独部署,JSP 或Servlet 将不能调用EJB 的本地接口。

(译)深入理解Promise五部曲--1.异步问题

在微博上看到有人分享LabJS作者写的关于Promise的博客,看了下觉得写得很好,分五个部分讲解了Promise的来龙去脉。从这篇文章开始,我会陆续把五篇博客翻译出来跟大家分享,在大牛的带领下真正理...
  • jjx0224
  • jjx0224
  • 2015年03月30日 14:23
  • 564

深入理解计算机系统(3.1)---走进汇编的世界

引言     本系列拖了蛮久了,主要是因为LZ写的时候其实刚看到第二章,因此这一段时间快速看了下第三章,并花了点时间沉淀了一下,这才耽误了下来。   本文是3.X系列的第一篇,也是汇编世界的开篇...
  • zuoxiaolong8810
  • zuoxiaolong8810
  • 2017年03月23日 11:42
  • 303

Java 深入理解与感悟

Java 不仅仅是一门编程语言,它还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统,移动终端,企业服务器和大型机等各种...
  • architect_zero
  • architect_zero
  • 2016年07月27日 00:11
  • 561

深入理解Java注解(1):基础详解

什么是注解(Annotation):   Annotation(注解)就是Java提供了一种与程序元素关联任何信息和着任何元数据(metadata)的途径和方法。Annotion(注解)是一个接口,...
  • zhoudaxia
  • zhoudaxia
  • 2014年06月29日 17:38
  • 6165

J2EE学习从菜鸟变大鸟之六 EJB(Enterprise JavaBean)企业级Java组件

EJB就是:"把自己编写的软件中那些需要执行制定的任务的类(具有特定功能的类),不放到客户端软件上了,而是给它打成包放到一个服务器上了"。EJB 就是将那些"类"放到一个服务器上,用C/S形式的软件客...
  • lishehe
  • lishehe
  • 2014年03月04日 00:00
  • 4320

WebLogic Enterprise JavaBean 编程

了解 Enterprise JavaBean 以下部分简要回顾了不同的 Enterprise JavaBean (EJB) 类型以及它们在应用程序中可提供的功能,并描述了它们如何使用其他应用程序...
  • kdsde
  • kdsde
  • 2014年08月28日 14:26
  • 687

javabean的理解

在MVC设计模式中常用JavaBeans来封装业务逻辑、数据库操作等等,从而很好地实现业务逻辑和表示逻辑的分离,使系统具有更好的健壮性和灵活性 。 1、什么是javabean。 JavaBea...
  • B452757715
  • B452757715
  • 2013年01月26日 11:57
  • 3042

《深入理解计算机系统》学习笔记--001

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • liuk10
  • liuk10
  • 2015年10月18日 22:48
  • 379

《深入理解计算机系统》笔记(三)链接知识【附图】

概述         ●该章节主要讲解的是ELF文件的结构。             ●静态库的概念         ●动态库(又叫共享库)的概念,一般用于操作系统,普通应用程序作用不大。    ...
  • hherima
  • hherima
  • 2013年05月23日 16:19
  • 3743

深入理解CSS

做web开发也快两年了,今天总结一下对CSS的理解,主要对以下几点进行解析: 1.display属性 首先应说几个概念,块级元素:block element;行内元素:inline element...
  • zhengxiaojunkite
  • zhengxiaojunkite
  • 2016年03月08日 21:39
  • 563
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入理解Enterprise JavaBean的Local调用问题
举报原因:
原因补充:

(最多只允许输入30个字)