软构件与中间件技术Java EE:第3章 企业Bean

上传人:壹****1 文档编号:569764491 上传时间:2024-07-30 格式:PPT 页数:87 大小:835KB
返回 下载 相关 举报
软构件与中间件技术Java EE:第3章 企业Bean_第1页
第1页 / 共87页
软构件与中间件技术Java EE:第3章 企业Bean_第2页
第2页 / 共87页
软构件与中间件技术Java EE:第3章 企业Bean_第3页
第3页 / 共87页
软构件与中间件技术Java EE:第3章 企业Bean_第4页
第4页 / 共87页
软构件与中间件技术Java EE:第3章 企业Bean_第5页
第5页 / 共87页
点击查看更多>>
资源描述

《软构件与中间件技术Java EE:第3章 企业Bean》由会员分享,可在线阅读,更多相关《软构件与中间件技术Java EE:第3章 企业Bean(87页珍藏版)》请在金锄头文库上搜索。

1、第3章 企业Bean吉林大学软件学院本章内容安排:3.1企业Bean概述3.2会话Bean概述3.3消息驱动Bean概述3.4企业Bean高级技术3.1企业Bean概述3.1.1什么是企业Bean 企业bean(Enterprise Bean)是用Java语言写成的概括应用的业务逻辑的服务器端组件,所谓业务逻辑是履行了应用的目标的代码。 使用企业bean的好处在于可以简化大型分布式应用系统的开发。3.1企业Bean概述3.1.1什么是企业Bean 使用EJB的理由:因为EJB(Enterprise JavaBean)容器给企业Bean提供了系统级的服务,所以企业bean的开发者完全可以将思想集

2、中于解决业务问题,EJB容器比企业bean的开发者更好地为诸如事务管理(Transaction Management)、安全授权(Security Authorization)等系统级服务负责。另外,因为企业bean比客户端包含了更多的应用业务逻辑,客户端的开发者可以着重于客户端的外观表现,而不必去编写实现业务规则或访问数据库的代码。其直接的结果是客户端可以更“瘦”了,特别重要的是客户端可以运行在更小的设备上了。3.1企业Bean概述3.1.1什么是企业Bean 在以下情况下,系统设计者可以考虑使用企业bean:如果系统必须被设计成可升级的。为了顺应日益增加的用户数量,需要将应用组件分布到多台

3、机器上,这不仅意味着企业bean需要在不同的机器上运行,而且其在系统中的位置还要对客户端保持透明。事务必须确保数据的完整。企业bean支持事务这种管理共享对象的并发访问的机制。应用有多种客户端。仅需为数不多的代码,远程客户端就能容易地定位企业bean,这些客户端可以是瘦的、多种多样的和为数众多的。3.1企业Bean概述3.1.2企业Bean的发展 EJB技术规范是随最早的Java EE版本J2EE 1.2一起诞生的,并随着Java EE版本的提升进行了多次的改进。 在EJB 2.X版本中,定义了会话bean,实体bean和消息bean等三种bean类型,其中的会话bean分为无状态会话bean

4、和有状态会话bean,实体bean分为BMP实体bean和CMP实体bean。 在EJB 3中,取消了实体bean,代之以持久性API,允许在bean类中使用Java语言元注释代替部署描述符,简化了bean的访问接口定义。经过如此改进,EJB 3对于程序员编写环节的要求大大降低,整个开发过程大大改进。3.1企业Bean概述3.1.3企业Bean的类型 在Java EE 6中,使用的是EJB 3.1规范,其中定义有会话bean和消息驱动bean等两种企业bean。会话bean又分为有状态会话bean、无状态会话bean和单身会话bean三种,其中的单身会话单身会话beanbean是在EJB 3.

5、1规范中首次定义的。 修改EJB规范的目的是为了简化企业bean的开发过程,减少开发者在开发过程中所需要实现的程序类和接口的数量,有利于企业bean的使用。3.1企业Bean概述3.1.3企业Bean的类型 为了兼容以往的EJB版本,EJB容器既要支持EJB 2.X版本的内容,又要支持EJB 3.X版本的内容。一个比较重要的问题是元注释和部署描述符的使用问题,EJB 3.X版中使用元注释来替代EJB 2.X版中的部署描述符,所以在实际开发中,EJB容器同时支持元注释和部署描述符。3.1企业Bean概述3.1.4开发企业Bean的基本要求一、开发企业Bean的一般步骤开发企业bean,必须提供以

6、下文件:企业bean类:实现企业bean的业务方法和生命周期回调方法业务接口:定义由企业bean类实现的业务方法,如果企业bean公开了本地无接口视图,则业务接口不是必须要求的帮助类:企业bean类需要的其他类,如异常类和实用类将上述文件打包到EJB JAR(Java Archive)文件或WAR(Web Archive)文件中,即可实现安装部署等工作。3.1企业Bean概述3.1.4开发企业Bean的基本要求二、企业bean的命名习惯一般地,如果业务接口的名字已经确定,则企业bean类的名字为业务接口的名字之后加“Bean”,企业bean的名字与企业bean类的名字相同,EJB JAR的显示

7、名字为业务接口的名字之后加“JAR”。例如,定义了业务接口的名字为“Calculate”,则企业bean类的名字就相应地为“CalculateBean”,企业bean的名字同样定为“CalculateBean”,EJB JAR的显示名字为“CalculateJAR”。3.2会话Bean3.2.1什么是会话Bean 会话bean囊括了客户端可以通过本地的、远程的和Web服务客户端所能够程序化调用的业务逻辑。要访问部署在服务器上的一个应用,客户端就要调用会话bean的方法。会话bean施行了其客户端的工作,通过在服务器上运行业务工作使其避免复杂性。 会话bean共有三种:有状态会话bean、无状态

8、会话bean和单身会话bean。3.2会话Bean3.2.2访问会话Bean的几种方式 客户端既可以通过无接口视图也可以通过业务接口访问企业bean。企业bean的无接口视图向客户端公开企业bean实现类的公有方法,客户端可以由此以实例引用访问企业bean实现类及其所有父类的公有方法。业务接口是一个包含了企业bean的业务方法的标准Java编程接口。3.2会话Bean3.2.2访问会话Bean的几种方式 选择比较好的接口设计和无接口视图可以简化Java EE应用的开发和维护,不仅清洁的接口和界面视图将客户端从EJB层中的任何复杂性中屏蔽开,而且这样做允许企业bean仅在内部改变而不影响客户端。

9、这是因为位于客户端的调用接口和方法的代码是公开和固定的,而实现接口和方法的代码在企业bean一方,改变企业bean一方的实现代码可以不修改客户端代码,而如果改变接口和方法的定义则要修改客户端。3.2会话Bean3.2.2访问会话Bean的几种方式 所以,良好的接口定义在开发过程中是十分重要的。会话bean可以有多个业务接口,可以根据程序设计需要实现其业务接口,这不是必须的。上述方式仅限于访问会话bean,消息驱动bean有不同的程序设计模式。3.2会话Bean3.2.2访问会话Bean的几种方式 可以在Java EE 6中使用以下几种方式实现对企业bean的访问。 一、在客户端使用企业bean

10、访问企业bean 企业bean的客户端或者通过依赖注入,使用Java编程语言的元注释,或者通过JNDI(JavaNaming and Directory Interface,Java命名和目录接口)查找,使用Java命名和目录接口语法找到企业bean实例,得到企业bean的实例的引用。3.2会话Bean3.2.2访问会话Bean的几种方式 二、通过本地客户端访问企业bean 使用Local元注释注明企业bean的业务接口为Local接口,或者使用Local元注释修饰bean类来指定接口并指定接口名都可以实现本地客户端。 本地客户端必须与它所访问的企业bean运行在同一个应用中,对于本地客户端,

11、所访问的企业bean的位置是不透明的。本地业务接口定义了bean的业务方法和生命周期方法,如果bean的业务接口不用Remote或Local元注释,如果bean类不用Remote或Local元注释指定接口,则业务接口默认为本地接口。3.2会话Bean3.2.2访问会话Bean的几种方式 企业bean的无接口视图是本地视图,企业bean实现类的公有方法向访问企业bean的无接口视图的本地客户端开放,使用无接口视图的企业bean不实现业务接口。3.2会话Bean3.2.2访问会话Bean的几种方式 三、通过远程客户端访问企业bean 用Remote元注释修饰企业bean的业务接口,或者用Remot

12、e元注释修饰bean类并指明业务接口即可以实现远程客户端。 远程客户端与访问的企业bean运行在不同的机器上和不同的JVM上,它可以是Web组件、应用客户端、另一个企业bean。对于远程客户端,企业bean的位置是透明的。被访问的企业bean必须实现一个业务接口,远程客户端不能通过无接口视图访问企业bean。3.2会话Bean3.2.2访问会话Bean的几种方式 如果不确定一个企业bean应该有的访问类型,选择远程的访问。这个选择给予更多的弹性,使得在部署企业bean的时候有更多的选择余地。3.2会话Bean3.2.2访问会话Bean的几种方式 四、通过Web服务客户端访问企业bean 企业b

13、ean和Web组件都可以作为Web服务客户端。 Web服务客户端可以通过两个途径访问Java EE应用程序,首先,Web服务客户端可以访问用JAX-WS创建的Web服务,其次,Web服务客户端可以调用一个无状态会话bean的业务方法。任何Web服务客户端可以访问无状态会话bean,但Web服务客户端不能访问消息bean。3.2会话Bean3.2.2访问会话Bean的几种方式 Web服务客户端通过bean的Web服务末端实现类来访问无状态会话bean。默认地,bean类的所有公有方法对于Web服务客户端都是可访问的。WebMethod元注释可以用来定制Web服务方法的行为,如果WebMethod

14、元注释用来修饰bean类的方法,则只有那些用WebMethod元注释修饰的方法才是向Web服务客户端公开的。3.2会话Bean3.2.3有状态会话Bean 一、有状态会话bean的概念 有状态会话bean(Stateful Session Bean)的实现类通常会包含类成员变量,当一个有状态会话bean实例存在时,其成员变量通常用来保存一个特定的客户端与有状态会话bean实例会话的状态,这种状态通常被称为会话状态。有状态会话bean不是共享的,每个有状态会话bean的对象实例只能有一个客户端。会话状态在会话存续期间保留,如果客户端删除了bean,会话将终止,状态就消失了。正因为如此,这种会话b

15、ean才被称作有状态会话bean。3.2会话Bean3.2.3有状态会话Bean 有状态会话bean适合在下列任何条件具备的情况下使用:会话bean的状态表现会话bean与特定的客户端的交互会话bean需要通过方法调用保持客户端的信息会话bean在客户端与应用的其他组件之间调节,向客户端表现简化的外观幕后,这个bean管理几个企业bean的工作流程3.2会话Bean3.2.3有状态会话Bean 二、有状态会话bean的生命周期 在有状态会话bean的生命周期中,分为不存在态(Does Not Exist)、就绪态(Ready)、钝化态(Passive)等三个状态。3.2会话Bean3.2.3有

16、状态会话Bean 容器执行依赖注入并调用标示了PostConstruct元注释的方法EJB容器可以通过将bean从内存移出到二级存储使bean失效,容器立即调用标示了PrePassivate元注释的方法客户端调用标示了Remove元注释的方法,EJB容器调用标示了PreDestroy元注释的方法如果客户端调用了bean的业务方法,EJB容器调用标示了PostActivate元注释的方法3.2会话Bean3.2.3有状态会话Bean 用PostConstruct、PreDestory,PostActivate、PrePassivate等元注释标示的方法称为有状态会话bean的生命周期回调方法(L

17、ifecycle Callback Methods),前两个元注释定义在javax.annotation包中,后两个元注释定义在javax.ejb包中。3.2会话Bean3.2.3有状态会话Bean 三、开发有状态会话bean 下面以一个在线书店的购物车为例,说明有状态会话bean的开发过程。3.2会话Bean3.2.3有状态会话Bean 第一步:定义业务接口。 业务接口中要清晰明确地定义出有状态会话bean实现类中要实现的所有业务方法,以便于客户端调用有状态会话bean中的方法,尤其是以远程的方式调用。业务接口通常要用Remote元注释标示为远程业务接口,如果用Local元注释标示或者不用这

18、两个元注释中的任何一个标示,则为本地业务接口。3.2会话Bean3.2.3有状态会话Bean业务接口在开发有状态会话bean的过程中不是必须给出的。 远程业务接口Cart的实例。import java.util.List;import javax.ejb.Remote;Remotepublic interface Cart 3.2会话Bean3.2.3有状态会话Bean public void initialize(String person) throws BookException; public void initialize(String person, String id) thro

19、ws BookException; public void addBook(String title); public void removeBook(String title) throws BookException; public List getContents(); public void remove();3.2会话Bean3.2.3有状态会话Bean 第二步:开发会话bean类。 按照企业bean的命名习惯,如果业务接口命名为Cart,会话bean类应该据此命名为CartBean。 会话bean类CartBean的实例。import cart.util.BookException

20、;import cart.util.IdVerifier;import java.util.ArrayList;import java.util.List;import javax.ejb.Remove;import javax.ejb.Stateful;3.2会话Bean3.2.3有状态会话BeanStatefulpublic class CartBean implements Cart List contents; String customerId; String customerName; public void initialize(String person) throws Boo

21、kException if (person = null) throw new BookException(Null person not allowed.);3.2会话Bean3.2.3有状态会话Bean else customerName = person; customerId = 0; contents = new ArrayList(); 3.2会话Bean3.2.3有状态会话Bean public void initialize(String person, String id) throws BookException if (person = null) throw new B

22、ookException(Null person not allowed.); else customerName = person; IdVerifier idChecker = new IdVerifier();3.2会话Bean3.2.3有状态会话Bean if (idChecker.validate(id) customerId = id; else throw new BookException(Invalid id: + id); contents = new ArrayList(); 3.2会话Bean3.2.3有状态会话Bean public void addBook(Stri

23、ng title) contents.add(title); public void removeBook(String title) throws BookException boolean result = contents.remove(title); if (result = false) throw new BookException( + title + not in cart.); 3.2会话Bean3.2.3有状态会话Bean public List getContents() return contents; Remove() public void remove() con

24、tents = null; 3.2会话Bean3.2.3有状态会话Bean 几点说明: Stateful元注释标示主类,说明它是一个有状态会话bean类; 有状态会话bean类中的方法还可以通过使用元注释被声明为生命周期回调方法; 用Remove元注释标示的方法可以被客户端调用,用来清除bean实例,在这样的方法被调用之后,容器将清除会话bean。3.2会话Bean3.2.3有状态会话Bean 第三步:编写帮助类。 在上面的CartBean类中,引入了两个类Verifier和BookException,Verifier是一个起着验证作用的实用类,BookException是用户定义的一个异常类

25、。像这种帮助会话bean类完成一定的功能的单独定义的类称为帮助类,也是会话bean的组成部分。程序清单3.3、程序清单3.43.2会话Bean3.2.3有状态会话Bean 第四步:编写客户端。 一个使用标准的Application程序实现的客户端的设计方案。程序清单3.5 在这个客户端程序中,使用了Cart接口访问会话Bean。cart.addBook(Infinite Jest);cart.addBook(Bel Canto);cart.addBook(Kafka on the Shore);3.2会话Bean3.2.3有状态会话Bean 到此,就可以编译、打包、部署和运行这个有状态会话be

26、an了,具体的执行步骤与所使用的开发工具有关。3.2会话Bean3.2.4无状态会话Bean 一、无状态会话bean的概念 实际上无状态会话bean(Stateless Session Bean)与有状态会话bean并无本质区别,二者之间的最大差别是无状态会话bean不保留与客户端会话的状态,当客户端调用无状态会话bean的方法时,bean实例的变量只在调用期间保留客户端的状态,当方法结束时,客户端的状态不应该留存。3.2会话Bean3.2.4无状态会话Bean 不过,客户端可以改变无状态会话bean的实例的类成员变量值,并且这个类成员变量值可以持续到下一次对该无状态会话bean的实例的调用。

27、无状态会话bean不针对特定的客户端,允许EJB容器分配一个无状态会话bean的对象实例给任何客户端。也就是说,无状态会话bean的状态,应适用于所有客户。因为他们可以支持多个客户端,无状态会话bean可以提供更好的可扩展性给需要大量的客户的应用。3.2会话Bean3.2.4无状态会话Bean 一个无状态会话bean能够实现Web服务,但是有状态会话bean却不能。 支撑相同数量的客户,一个应用程序需要无状态会话bean的数量通常会少于有状态会话bean的数量。3.2会话Bean3.2.4无状态会话Bean 无状态会话bean适合在下列任何条件具备的情况下使用:会话bean的状态没有为特定的客

28、户端的数据单一的方法调用中,会话bean为所有客户端执行一般性的任务,如可以使用无状态会话bean传送确认在线命令的电子邮件会话bean执行Web服务3.2会话Bean3.2.4无状态会话Bean 二、无状态会话bean的生命周期 因为无状态会话bean从不被钝化,其生命周期只有不存在态和就绪态。3.2会话Bean3.2.4无状态会话BeanEJB容器生成并保持一个无状态会话bean池(pool),开始无状态会话bean的生命周期。容器执行依赖注入并调用标示了PostConstruct元注释的方法EJB容器调用标示了PreDestroy元注释的方法3.2会话Bean3.2.4无状态会话Bean

29、 无状态会话bean的生命周期回调方法是用PostConstruct、PreDestory等元注释标示的方法。3.2会话Bean3.2.4无状态会话Bean 三、开发无状态会话bean 开发无状态会话bean的步骤与开发有状态会话bean的步骤基本相同。 例子:一个计算欧元和日元兑换的例子,其中没有使用业务接口和帮助类,只有会话bean类和客户端。3.2会话Bean3.2.4无状态会话Bean 第一步:开发会话bean类。import java.math.BigDecimal;import javax.ejb.Stateless;Statelesspublic class ConverterB

30、ean 3.2会话Bean3.2.4无状态会话Bean private BigDecimal euroRate = new BigDecimal(0.0093016); private BigDecimal yenRate = new BigDecimal(83.0602); public BigDecimal dollarToYen(BigDecimal dollars) BigDecimal result = dollars.multiply(yenRate); return result.setScale(2, BigDecimal.ROUND_UP); 3.2会话Bean3.2.4无状

31、态会话Bean public BigDecimal yenToEuro(BigDecimal yen) BigDecimal result = yen.multiply(euroRate); return result.setScale(2, BigDecimal.ROUND_UP); 3.2会话Bean3.2.4无状态会话Bean 第二步:编写客户端。特点:采用了一个servlet程序作客户端使用了无接口视图访问会话Bean通过依赖注入获取ConverterBean的引用,使用EJB元注释程序清单3.73.2会话Bean3.2.4无状态会话Bean 两处调用无状态会话Bean Convert

32、erBean的方法的地方:BigDecimal yenAmount = converter.dollarToYen(d);BigDecimal euroAmount = converter.yenToEuro(yenAmount);processRequest方法的流程就是生成了一个XHTML文档。三个对于servlet程序已有方法的覆盖,用Override标示。3.2会话Bean3.2.5单身会话Bean 单身会话bean(Singleton Session Bean)是EJB 3.1规范新增加的一项内容,也是EJB 3.1规范做出的一项重要改进。 一、单身会话bean的概念 单身会话bea

33、n与无状态会话bean更相似一些,单身会话bean为单独的企业bean实例被多个客户端共享和同时访问的场合而设计。每个应用中只有一个单身会话bean,而不是一个连接池中的任何无状态会话bean都可能会响应客户端请求。3.2会话Bean3.2.5单身会话Bean 如同无状态会话bean,单身会话bean亦能够实现Web服务末端。单身会话bean只维护他们的客户端在调用期间的状态,并不需要维护整个服务器崩溃或停止的状态。因为单身会话bean将在整个应用程序生命周期中运行,所以允许单身会话bean为应用程序执行初始化任务,单身会话bean在应用程序关闭时可能会执行清理任务。3.2会话Bean3.2.

34、5单身会话Bean 单身会话bean适合在下列任何条件具备的情况下使用:会话bean的状态需要在整个应用程序共享需要由多个线程同时访问一个单一的企业bean应用程序需要一个企业bean在应用程序启动和关闭后执行任务会话bean执行Web服务3.2会话Bean3.2.5单身会话Bean 二、单身会话bean的生命周期 与无状态会话bean相似,单身会话bean也从不被钝化,其生命周期也只有不存在态和就绪态。3.2会话Bean3.2.5单身会话BeanEJB容器生成一个单身会话bean的实例,开始单身会话bean的生命周期。容器执行依赖注入并调用标示了PostConstruct元注释的方法EJB容

35、器调用标示了PreDestroy元注释的方法3.2会话Bean3.2.5单身会话Bean 单身会话bean的生命周期回调方法与无状态会话bean的生命周期回调方法相同,也是用PostConstruct、PreDestory等元注释标示的方法。3.2会话Bean3.2.5单身会话Bean 三、管理并发访问 单身会话bean是设计用来应对多个客户端意欲同时访问同一个bean实例的并发访问场合。管理并发访问的方式有两个:容器管理并发和bean管理并发,默认为容器管理并发。元注释ConcurrencyManagement就是用来标示单身会话bean的并发访问管理方式的。元注释的类型描述值必须是CONT

36、AINER和BEAN二者之一。3.2会话Bean3.2.5单身会话Bean 当单身会话bean的并发访问管理方式被定为容器管理时,还可以用Lock元注释加上LockType描述来标示单身会话bean的业务方法和会话bean类。当用Lock(READ)元注释标示某个方法时,表明方法可以被并发访问;当用Lock(WRITE)元注释标示时,表明方法在被一个客户端访问时,其他客户端的访问被锁定。当用Lock元注释标示会话bean类时,相当于对类中的所有方法标示Lock元注释。3.2会话Bean3.2.5单身会话Bean 当单身会话bean的并发访问管理方式被定为bean管理时,所有的方法都允许同步并发

37、访问。 有别于其他企业bean,单身会话bean实例一旦被初始化,将不会被销毁,这保证了一个实例的使用会贯穿一个应用程序的生命周期。3.2会话Bean3.2.5单身会话Bean 四、开发单身会话bean 下面的例子中设计了一个名为CounterBean的单身会话bean,能表现出一个页面被访问的次数。其Web前端包含有一个JavaServer Faces管理的名为Count的bean,由XHTML文档template.xhtml和template-client.xhtml使用,Count通过依赖注入获取CounterBean的引用。3.2会话Bean3.2.5单身会话Bean CounterB

38、ean类的代码程序清单3.8 import javax.ejb.Singleton;Singletonpublic class CounterBean private int hits = 1; / Increment and return the number of hits3.2会话Bean3.2.5单身会话Beanpublic int getHits() return hits+; 3.2会话Bean3.2.5单身会话BeanWeb前端的Count类的代码程序清单3.9 EJB private CounterBean counterBean;语句使用了依赖注入 hitCount = co

39、unterBean.getHits();语句访问了CounterBean类3.2会话Bean3.2.5单身会话Bean template-client.xhtml的代码中,通过一个EL表达式“#count.hitCount”访问了hitCount属性,将点击次数传递到页面。程序清单3.10 This page has been accessed #count.hitCount time(s). 3.3消息驱动Bean3.3.1什么是消息驱动Bean 一、消息驱动bean的概念 消息驱动bean(Message-Driven Bean)是允许Java EE应用异步地处理消息的企业bean,该类型

40、的bean通常担当一个消息监听器的作用,消息监听器类似于事件监听器,但是只接收消息。消息可以由应用客户端、企业bean、Web组件、JMS应用程序等任何Java EE组件,甚至是不使用Java EE技术的系统传递,消息驱动bean能够处理JMS消息和其他类型的消息。3.3消息驱动Bean3.3.1什么是消息驱动Bean 消息驱动bean不同于会话bean之处在于应用客户端不访问消息驱动bean。消息驱动bean也不保留与特定客户端对话时的状态,在EJB容器中的所有消息驱动bean实例都是等效的,可以将其分配给任何一个消息,一个消息驱动bean实例可以处理来自多个客户端的消息。 消息驱动bean

41、的实例的变量可能会保留类似于JMS API连接、开放式数据库连接、一个企业bean对象的引用等客户端消息状态。3.3消息驱动Bean3.3.1什么是消息驱动Bean 客户端组件不能定位消息驱动bean并访问其方法,而是通过发送消息给实现了消息监听器的消息驱动bean类的方式来与之沟通。 消息驱动bean是无状态的、异步的、相对短暂的、可事务化处理的。 会话bean通常可以同步发送和接收消息,但是不能实现异步处理,为了避免阻塞服务器资源,JMS消息不应该同步发送和接收,此时,就应该使用消息驱动bean异步地处理消息。3.3消息驱动Bean3.3.1什么是消息驱动Bean 二、消息驱动bean的生

42、命周期 与无状态会话bean相似,消息驱动bean也从不被钝化,其生命周期也只有不存在态和就绪态。3.3消息驱动Bean3.3.1什么是消息驱动BeanEJB容器通常生成一个消息驱动bean实例池容器执行依赖注入并调用标示了PostConstruct元注释的方法EJB容器调用标示了PreDestroy元注释的方法3.3消息驱动Bean3.3.1什么是消息驱动Bean 消息驱动bean的生命周期回调方法与无状态会话bean的生命周期回调方法相同,也是用PostConstruct、PreDestory等元注释标示的方法。3.3消息驱动Bean3.3.1什么是消息驱动Bean 三、开发消息驱动bea

43、n 下面的例子是由一个消息驱动bean类和一个能发送消息的标准application程序组成的。作为客户端的application程序向消息队列中发送一些消息,消息驱动bean异步接收和处理从队列中传来的消息。程序清单3.11用MessageDriven元注释来标示bean类实现了MessageListener消息监听器接口,给出了这个接口的方法onMessage的实现。3.3消息驱动Bean3.3.1什么是消息驱动Bean 发送消息的标准application程序程序清单3.12 实际上就是一个异步消息发送方,它向消息队列中发送个数为NUM_MSGS的消息,这些消息由队列传递给SimpleM

44、essageBean,后者将其处理。消息的发送和接收是异步进行的。3.3消息驱动Bean3.3.1什么是消息驱动Bean4个步骤connection = connectionFactory.createConnection();session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);messageProducer = session.createProducer(queue);message = session.createTextMessage();发送操作message.setText(This is mess

45、age + (i + 1);messageProducer.send(message);3.3消息驱动Bean3.3.2消息驱动Bean与Java消息服务 消息驱动bean与Java消息服务(Java Message Service,JMS)有着密切的联系,消息驱动bean通过消息方式为调用者提供服务,JMS是消息驱动bean支持的一种最基本消息类型。消息驱动bean实现了Java消息服务所支持的几种消息传递方式中的一种消息异步发送和接收。一些基本概念,如队列、消息等,在消息驱动bean部分和在Java消息服务部分都是相同的。3.3消息驱动Bean3.3.2消息驱动Bean与Java消息服务

46、由于消息驱动bean组件在实际使用过程中,其客户并不拥有消息驱动bean组件的远程引用,而是直接将调用消息发送到特定消息队列中,因而客户的调用不强调消息驱动bean组件的运行。消息驱动bean是通过用消息监听器处理消息的方式实现访问运行,因而JMS是其调用媒介。3.4企业Bean高级技术3.4.1使用嵌入式企业Bean容器 嵌入式企业bean容器(Embedded Enterprise Bean Container)是用来从代码运行在Java SE环境的客户端访问企业bean的,容器和客户端运行于同一个虚拟机。典型地,嵌入式企业bean容器用来测试企业bean而不必将其部署到服务器上。 大多数

47、在Java EE服务器上的企业bean容器中出现的服务都在嵌入式企业bean容器上有效,包括注入、事务、安全,企业bean组件在这两种环境下运行结果相似,因此,同一个企业bean可轻易地在独立应用与网络应用间重用。3.4企业Bean高级技术3.4.1使用嵌入式企业Bean容器 javax.ejb.embedded包中的EJBContainer抽象类代表了企业bean容器,createEJBContainer方法用来生成并初始化一个嵌入式企业bean容器实例。在程序中可以以类似如下的方式使用:EJBContainer ec = EJBContainer.createEJBContainer();

48、在此基础上,可以用以下的代码关闭嵌入式企业bean容器:ec.close();3.4企业Bean高级技术3.4.2在会话Bean中使用异步方法调用 一、异步方法的概念 异步方法调用(Asynchronous Method Invocation)是EJB 3.1规范中给出的最为重要的创新之一,在会话bean中可以实现这样的异步方法:在用会话bean实例调用方法之前,企业bean容器就将业务方法控制权返回给客户端。客户端可以随后用Java SE并发API检索结果,退出调用,检查异常。异步方法通常用于长期运行的操作,为处理器密集型任务,后台任务,以提高应用程序吞吐量,改善应用程序的响应时间,如果方法

49、调用的结果并不立即需要。3.4企业Bean高级技术3.4.2在会话Bean中使用异步方法调用 当一个会话bean客户端调用一个典型的非异步的业务方法时,直到该方法已执行完成,控制才返回给客户端。不过,客户端调用异步方法,立即有控制由企业bean容器返回给他们。这允许客户端当方法调用完成时执行其他任务。3.4企业Bean高级技术3.4.2在会话Bean中使用异步方法调用 二、生成异步业务方法 只要使用javax.ejb.Asynchronous元注释标示会话bean的一个业务方法就可以将其定义为异步业务方法,或者使用javax.ejb.Asynchronous元注释标示会话bean的实现类将其所

50、有方法定义为异步业务方法。异步业务方法的返回类型要么为空,要么是Future接口的实现类,Future接口定义在java.util.concurrent包中。如果返回类型为空,异步业务方法不能声明异常;如果返回类型是Future接口的实现类,则可以声明异常。如以下的代码就是合法的:3.4企业Bean高级技术3.4.2在会话Bean中使用异步方法调用Asynchronouspublic Future processPayment(Order order) throws PaymentException . 异步业务方法的返回结果首先返回给企业bean容器,而不是直接返回给客户端,再由企业bean容器提供给客户端。3.4企业Bean高级技术3.4.2在会话Bean中使用异步方法调用 三、调用异步业务方法 调用异步业务方法的方式没有特殊要求,如果异步业务方法返回结果,客户端会在调用异步业务方法之后即刻收到一个Future实例,该实例可用于检索最终结果,取消调用,检查调用是否已经完成,检查是否有在处理过程中抛出的异常,并检查是否调用被取消。课后相关知识阅读:POJO元注释泛型部署描述符

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号