浏览 1531 次
锁定老帖子 主题:以连接器为基础的消息驱动Bean
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-19
是EJB提供商支持仅一个或少数的JMS提供者(通常只有一个).在前面的EJB2.1 中,大多数厂商只支持他们自己的JMS提供者,并且没有其它的.显然,这样的限制 是你的选择:如果你的公司或公司的一部分使用一个JMS提供者,它不被EJB提供 商支持,你将不能够处理JMS提供者传递过来的消息. 问题的本质是复杂的并且要求对事务管理有一个深入的理解.简言之,对于MDB, 消息被JMS提供者传递到MDB,并且所有的工作由MDB执行(例如,使用JDBC,调用其 他Bean上的方法,等等),必需是同一事务的一部分,被EJB容器初始化.这需要 EJB 容器事前知道信息递送即将来临以便在信息实际上被递送之前,它能开始处 理. 不幸地, JMS API 不支援这种功能.因此在早期的EJB 中, JMS 提供者必 须执行和每个EJB 厂商的订制整合.整合的花费是昂贵的(业务),所有旧的 EJB2.0厂商一般选择少许的集成JMS提供者. 另一个JMS为基础的MDB限制是JMS程序模型的限制;没有其它的消息系统支持. 虽然JMS是非常有用的,不过它不是唯一可用的消息系统.SOAP,Email,CORBA消息, 用于ERP系统中的所有消息系统(SAP,PeopleSoft,等等),遗留下来的消息系统, 如其它的非JMS消息系统. EJB 3.0(和2.1) 支持扩展,更多公开定义的消息驱动Bean,允许他们服务任何 种类的消息系统从任何厂商.唯一的要求是新类型的消息驱动Bean上附着消息驱 动Bean的生命周期.EJB 厂商能建立代码来支持新的消息系统(一些其它的JMS), 但是,他们必需也一定支持任何以JCA 1.5为基础的消息驱动Bean. JCA提供一个标准的服务器提供接口(SPI)允许任何的IES插入到J2EE容器系统. 连接器结构的1.0版本仅仅应用在请求/响应资源,J2EE组件(EJB或servlet/Jsp) 初始化请求.当前版本为1.5,要求j2EE1.4或更高,更加全面并且可以开作在任意 的异步消息系统中. 在这倦的系统中,J2EE组件等候消息的到达,代替初始化交 互同EIS;EIS的初始化将互通过消息的分离. JCA1.5明确定义一个消息的契约同消息驱动Bean的连接.它定义一个EJB容器和 一个异步连接,所以消息驱动Bean可以自动处理来自EIS的信息.MDB以一个异步 连接为基础,实现一个指定的消息接口的定义通过连接器自身.代替实现 javax.jms.MessageListener接口.MDB实现一些其它类型的接口指定到EIS.例如, 第三章中介绍的一个假设的邮件连接,允许MDB处理类似的以JMS为基础的JMS消 息.电子邮件连接器从厂商X 购买和传递一个JAR文件被叫做资源档案 (RAR).RAR 包含所有的连接代码和必需的部署描述符植入到EJB 容器系统. 它也定义了开发者使用的用于创建一个电子邮件的MDB所需的接口.这是一个假 设的电子邮件消息接口,他必需实现一个电子邮件的MDB: package com.vendorx.email; public interface EmailListener { public void onMessage(javax.mail.Message message); } Bean类实现这个接口,负责处理电子邮件连接器递送的消息.下面的代码显示了 一个MDB实现EmailListener 接口和处理电子邮件: package com.titan.email; @MessageDriven(activationConfig={ @ActivationConfigProperty( propertyName="mailServer", propertyValue="mail.ispx.com"), @ActivationConfigProperty( propertyName="serverType", propertyValue="POP3 "), @ActivationConfigProperty( propertyName="messageFilter", propertyValue="to='submit@titan.com'")}) public class EmailBean implements com.vendorx.email.EmailListener { public void onMessage(javax.mail.Message message){ javax.mail.internet.MimeMessage msg = (javax.mail.internet.MimeMessage) message; Address [] addresses = msg.getFrom( ); // continue processing Email message } } 在这个例子中,容器调用onMessage()传递一个JavaMail Message对象,那个代表 一个email消息包含MIME附件.然而,消息接口通过使用连接器为基础的MDB没有 使用onMessage().方法名和方法签名可以是适当的EIS;它甚至可以有返回类型. 例如,一个连接器可以为SOAP开发处理请求/应答形式的消息.这个连接器可以使 用ReqRespListener定义通过XML消息的Java API.SOAP消息API由sun制定,它不 是J2EE平台的一部分: package javax.xml.messaging; import javax.xml.soap.SOAPMessage; public interface ReqRespListener { public SOAPMessage onMessage(SOAPMessage message); } 在这个接口中,onMessage()有一个SOAPMessage类型的返回值.这意谓EJB 容器 和连接器负责把应答信息协调回到寄件人. (或者到一些部署描述符中定义的目 的地).除了支持不同的方法信号外,消息接可能存在多个方法为处理不同种类的 消息使用相同的MDB.新的消息驱动Bean无限制的被EJB容器系统支持.真正美好 的是以连接器为基础的MDB完成的跨跃多个EJB厂商,因为所有的提供商必需支持 他们.如果以使用连接器为基础的MDB同提供商A和过后你想改变提供商为B,你可 以继续使用相同的连接器为基础的MDB,不会出现问题. 活动配置属性使用非JMS为基础的MDB依赖连接器类型和它的请求.让我们看一个 例子: @MessageDriven(activationConfig={ @ActivationConfigProperty( propertyName="mailServer", propertyValue="mail.ispx.com"), @ActivationConfigProperty( propertyName="serverType", propertyValue="POP3"), @ActivationConfigProperty( propertyName="messageFilter", propertyValue="to='submit@titan.com'")}) 我们在前面谈论过的@ActivationConfigProperty.如同你看到的前面的例子,任 何name/value对被这个元数据支持,因此,它可以很容易的支持邮件指定的配置 为这种连接器类型. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |