论坛首页 Java企业应用论坛

以连接器为基础的消息驱动Bean

浏览 1531 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-04-19  
虽然以JMS 为基础的MDB 已经证明非常有用, 它也有限制.也许最大的限制就
是EJB提供商支持仅一个或少数的JMS提供者(通常只有一个).在前面的EJB2.1
中,大多数厂商只支持他们自己的JMS提供者,并且没有其它的.显然,这样的限制
是你的选择:如果你的公司或公司的一部分使用一个JMS提供者,它不被EJB提供
商支持,你将不能够处理JMS提供者传递过来的消息.
  • 绕过这个JMS通道,消息的路由从一个JMS提供者到另一个,这是一个EJB规范
  • 外的一个习惯上的解决方法.
    问题的本质是复杂的并且要求对事务管理有一个深入的理解.简言之,对于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对被这个元数据支持,因此,它可以很容易的支持邮件指定的配置
    为这种连接器类型.
    论坛首页 Java企业应用版

    跳转论坛:
    Global site tag (gtag.js) - Google Analytics