J2EE组件开发 - 消息驱动的EJB - 编程入门网
结构
消息驱动的Bean组件的基本体系结构。位于顶端的是javax.ejb.EnterpriseBean接口,它是所有EJB的基础接口。EnterpriseBean接口派生出了javax.ejb.MessageDrivenBean接口,所有消息驱动的EJB类必须实现javax.ejb.MessageDrivenBean接口。此外,消息驱动的Bean必须实现javax.jms.MessageListener接口。公用的、非最终的、非抽象的消息驱动的EJB,消息驱动的EJB与其他类型的EJB不同,它们不把业务方法导出给客户程序,它们关心的只是遵从EJB容器的接口要求。由于这个原因,消息驱动的Bean必须有一个不需要参数的公用构造方法(ejbCreate()方法),而且不应该实现finalize()方法。 2.1 MDB接口 在消息驱动的Bean中,setMessageDrivenContext()方法用来把一个MessageDrivenContext的对象实例传递给EJB,它是MessageDrivenBean接口定义中容器调用的第一个方法。 MessageDrivenContext对象封装了一个EJB消息驱动容器上下文的接口,支持消息驱动的EJB实例访问容器提供的运行时消息驱动上下文对于消息驱动的EJB来说,关键之一是要实现一个没有参数的ejbCreate()方法。当EJB容器准备创建消息驱动EJB的实例时,它将调用这个方法。容器之所以决定创建某个EJB的实例,可能是因为它要构造一个Bean实例的缓冲池,也可能是因为它接收到了客户的请求。这个ejbCreate()方法和其他Bean上的EJB构造方法类似,属于EJB实现的一种特殊的构造函数或初始化方法。 当EJB容器准备不让Bean实例继续处理客户程序的请求时,它就会调用消息驱动Bean的ejbRemove()方法。何时在消息驱动的Bean上调用ejbRemove()方法由EJB容器单独决定,不受EJB客户程序的任何约束。应当注意的是,容器并不保证一定调用ejbRemove()方法。在正常操作时,容器会调用ejbRemove()方法;但是,当消息驱动的Bean向容器抛出了系统异常时,不能保证ejbRemove()方法一定会被调用。由于这个原因,Bean开发者必须按时检查和清除Bean分配的所有资源。 对于Bean开发者来说,最重要的任务也许是实现onMessage()方法。当一个异步消息必须由Bean实例处理时,容器将调用onMessage()方法。onMessage()方法的参数是一个普通的JMS javax.jms.Message的实例,消息驱动的EJB实例从这个Message的实例提取待处理的数据完成消息处理。 2.2 JMS消息接口 那么,在onMessage()方法调用传入的 JMS消息中,消息驱动的Bean如何提取信息,可以提取哪些信息呢?图二描述了基本JMS消息类型的核心接口和概念。在一个以JMS为基础的消息系统中,Message接口是在系统中传递的所有消息的最基本的接口(或称之为根接口,Root Interface)。Destination接口描述了消息传递的一个终端;类似地,由于消息有一个传递模式,所以图二还显示了Message接口与DeliveryMode接口的概念上的关系。 JMS消息的头信息可以通过一组标准的方法设置或提取,这组标准方法的名字为getJMSXXX()或setJMSXXX()形式(下面我们分别称之为get方法和set方法),其中XXX是消息头信息中的属性名字,例如getJMSDeliveryMode()方法。在Message接口中,通过get方法和set方法操作的标准头信息属性包括:唯一的消息ID,时标(Timestamp),答复和目标地址,消息传递模式,消息类型,以及消息的优先级。 在JMS消息中,JMS容器提供者特有的属性可以通过getXXXProperty()方法提取,或通过setXXXProperty()方法设置,其中XXX表示属性的类型,例如byte getByteProperty(java.lang.String name)。每一个属性有一个通过String对象指定的名字和相应的值。名字以JMSX前缀开头的属性作为标准JMS属性保留。 与消息正文数据(或称之为消息体,与消息头相对而言)的五种类型对应,五种消息类型扩展了Message接口,如图三所示。Byte数据由BytesMessage封装,Serializable |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |