开发企业应用程序以使用消息驱动的 bean

应用程序可以将消息驱动的 bean 用作异步消息使用者。您将消息驱动的 bean 部署为目标的消息侦听器。当消息到达受监控的输入目标时,消息驱动的 bean 将由激活规范或 JMS 侦听器调用。

关于此任务

您将企业应用程序开发为像是使用任何其他企业 Bean 一样使用消息驱动的 bean,但消息驱动的 bean 不具有 Home 接口或远程接口。

您应该将消息驱动的 bean 开发成委托另一个企业 Bean 来完成入局消息的业务处理,以便明确地将消息处理与业务处理分隔开。此分隔还意味着,可以由于入局消息的到达而调用业务处理,也可以由 WebSphere® J2EE 客户机之类的对象进行调用。响应可由充当发送方 Bean 的另一个企业 Bean 处理,也可以在消息驱动的 bean 中处理。

EJB 2.0 消息驱动的 bean 只支持 Java™ 消息服务 (JMS) 消息传递。除支持 JMS 以外,EJB 2.1 和 EJB 3 消息驱动的 bean 还可以支持其他消息传递类型。所有消息驱动的 Bean 必须实现 MessageDrivenBean 接口。对于 JMS 消息传递,消息驱动的 Bean 还必须实现消息侦听器接口 javax.jms.MessageListener。其他符合 Java EE 连接器体系结构 (JCA) 的资源适配器可能会提供他们自己的必须实现的消息侦听器接口。

可以使用 Rational® Application Developer 的“新建企业 Bean”向导来创建 Bean 类型为消息驱动的 Bean 的企业 Bean。向导创建此类型 bean 的相应方法。

按约定,消息驱动的 Bean 类名为 nameBean,其中 name 是指定给消息驱动的 Bean 的名称;例如:
public class MyJMSppMDBBean implements MessageDrivenBean, javax.jms.MessageListener

如果消息驱动的 bean 还实现了 javax.ejb.TimedObject 接口并通过调用 void ejbTimeout(Timer) 对计时器回调方法进行了调用,那么可向 EJB 定时器服务注册消息驱动的 bean 以获取基于时间的事件通知。在预设时间,容器会调用消息驱动的 bean 的 ejbTimeout 方法。

消息驱动的 bean 类必须定义和实现下列方法:
  • onMessage(message),它必须满足以下需求:
    • 方法必须具有类型为 javax.jms.Message 的单个自变量。
    • throws 子句不能定义任何应用程序异常。
    • 如果消息驱动的 bean 配置为使用 bean 管理的事务,那么它必须调用 javax.transaction.UserTransaction 接口以限定事务的作用域。因为这些调用发生在 onMessage() 方法内,所以事务作用域不包含初始消息接受。有关更多信息,请参阅有关消息驱动 Bean 事务支持的主题。

    要在 onMessage() 方法中处理消息(例如,将消息传递到另一个企业 Bean 上),您使用标准 JMS。 它被称为 bean 管理的消息传递。

    如果您要使用具有另一个消息侦听器接口的符合 JCA 的资源适配器,那么除了 onMessage() 方法之外,可能还需要另一种方法。有关需要的消息侦听器接口的信息,请参阅与符合 JCA 的资源适配器一起提供的文档。

  • ejbCreate()

    您必须为您要创建企业 Bean 新实例的每种方法定义和实现 ejbCreate 方法。

  • ejbRemove()

    当客户机调用由企业 Bean 的 home 接口从 javax.ejb.EJBHome 接口继承的 remove 方法时,容器调用此方法。此方法必须包含在从容器移除企业 Bean 实例(并从数据源移除相关数据)前您要执行的任何代码。

  • ejbTimeout(Timer)

    此方法包含用于处理所接收的时间事件的业务逻辑,仅当支持计时器服务的通知才需要。

过程

  1. 创建企业应用程序项目。
  2. 创建消息驱动的 bean 类。 您可以使用 Rational(r) Application Developer 的“新建企业 Bean”向导来创建具有消息驱动的 bean 类型的企业 Bean。

    有关如何创建消息驱动的 bean 类的示例,请参阅本主题的“示例”部分。有关更多信息,请参阅 Rational Application Developer 信息中心中的“创建消息驱动的 Bean”

    此步骤将生成可以组装成 EAR 文件以进行部署的消息驱动的 bean。
  3. 可选: 使用 EJB 部署描述符编辑器来查看以及根据需要更改部署属性。 您可以使用 EJB 部署描述符编辑器来查看您在 EJB 创建向导中指定的部署属性(例如事务类型消息选择器)以及其他缺省部署属性。

    以后,在将企业应用程序导出为用于执行部署的 EAR 文件之后,可以根据需要覆盖这些属性的值,如针对符合 JCA 1.5 的资源为消息驱动的 bean 配置部署属性针对侦听器端口为消息驱动的 bean 配置部署属性所述。

    1. 在属性窗格中,选择 Bean 选项卡。
    2. 在主面板上,配置事务类型属性。
      事务类型
      此属性确定是消息驱动的 Bean 管理它自己的事务还是容器为该 bean 管理事务。
      Bean
      消息驱动的 Bean 管理它自己的事务。
      容器
      容器管理代表 bean 的事务。
    3. 激活配置下,查看以下属性:
      acknowledgeMode
      此属性确定会话如何确认其接收的任何消息。
      自动确认
      会话自动地确认每个消息的交付。
      重复确定确认
      会话惰性地确认消息的交付。如果 JMS 失败,此设置可能导致传递一些重复消息,因此只有可接受重复消息的用户应用程序才应该使用。

      如 EJB 规范中所定义的,客户机无法使用 Message.acknowledge() 方法确认消息。如果 CLIENT_ACKNOWLEDGE 的值在 creatxxxSession 调用上传递,那么消息由应用程序服务器自动确认,而不使用 Message.acknowledge()方法。

      注:

      删除消息时发送确认。

      如果您有非事务性消息驱动的 Bean,那么系统会在消息驱动的 Bean 启动或完成时删除消息。如果消息驱动的 Bean 生成异常,因而无法完成时,系统将执行下列其中一个操作:
      • 如果系统配置为在消息驱动的 Bean 完成时删除消息,那么会将消息分派到消息驱动的 Bean 的新实例,从而使消息有进行处理的其他机会。
      • 如果系统配置为在消息驱动的 Bean 启动时删除消息,那么该消息会丢失。

      如果服务质量设置为最大努力非持久,那么将在消息驱动的 Bean 启动时删除消息。对于所有其他服务质量,在消息驱动的 Bean 完成时删除消息。

      destinationType
      此属性确定消息驱动的 Bean 是使用队列还是主题目标。
      队列
      消息驱动的 Bean 使用队列目标。
      主题
      消息驱动的 Bean 使用主题目标。
      subscriptionDurability
      此属性确定 JMS 主题预订是持久的还是非持久的。
      持久
      订户用 JMS 保留的唯一标识注册持久预订。用同一标识的后续订户对象以先前订户保留的状态继续预订。如果持久预订没有活动订户,那么 JMS 会保留预订的消息,直到预订接收到他们或者他们到期。
      非持久
      非持久预订维持的时间是其订户对象的生存期。这意味着仅当客户机订户活动时,客户机才能看到在主题中发布的消息。如果订户不活动,客户机会错过其主题上发布的消息。

      非持久订户只能在创建该订户时存在的同一事务上下文(例如,全局事务或非指定的事务上下文)中使用。

      messageSelector
      此属性确定 JMS 消息选择器,该消息选择器用于选择消息驱动的 Bean 接收哪些消息。 例如:
      JMSType='car' AND color='blue' AND weight>2500

      选择器字符串可引用 JMS 消息头中的字段和消息属性中的字段。消息选择器不能引用消息主体值。

    4. 指定绑定部署属性。

      WebSphere 绑定下,选择 JCA 适配器选项,然后指定绑定部署属性:

      激活规范 JNDI 名称
      此属性指定激活规范的 JNDI 名称,该激活规范用于部署此消息驱动的 Bean。此名称必须与您为 WebSphere Application Server 定义的激活规范的名称相匹配。
      激活规范权限别名
      此属性指定用于认证到 JCA 资源适配器的连接的认证别名名称。认证别名指定用于认证创建到 JCA 资源适配器的新连接的用户标识和密码。
      目标 JNDI 名称
      此属性指定消息驱动的 Bean 用于在 JNDI 名称空间中查找 JMS 目标的 JNDI 名称。
    5. 可选: 指定目标链接以启用消息链接功能。

      消息链接功能允许将消息路由至部署中的特定消息驱动的 bean。消息链接功能允许在同一应用程序中的组件之间编排消息流。

      为了使消息驱动的 bean 能够使用和处理消息,必须在与该消息驱动的 bean 相关联的部署描述符中定义 <message-destination-link> 元素。由 <message-destination-link> 元素标识的目标对应于逻辑目标。

      <message-destination-ref> 包含 <message-destination-link> 元素时,将在该目标处使用消息。

      为了使消息驱动的 bean 能够使用发送至目标的消息,您可以在部署描述符中声明 <message-destination-link> 元素,也可以在激活规范中设置该元素。

  4. 组装并打包应用程序以进行部署。

结果

本任务将生成企业应用程序的 EAR 文件,此文件包含消息驱动的 bean 并可以部署到 WebSphere Application Server 中。

示例

以下示例说明如何创建消息驱动的 bean 类。代码示例说明如何访问类型为 TextMessage 的 JMS 消息中的文本和 JMS MessageID。在此示例中,首先,使用消息驱动的 bean 的 onMessage() 方法来解压缩入局文本消息并抽取文本和消息标识;然后,使用专用 putMessage 方法(在同一消息 bean 类中定义)将此消息放到另一队列上:

public void onMessage(javax.jms.Message msg)
{
        String text      = null;
        String messageID = null;

        try
        {
                text = ((TextMessage)msg).getText();

                System.out.println("senderBean.onMessage(), msg text2: "+text);

                //
                // store the message id to use as the Correlator value
                //
                messageID = msg.getJMSMessageID();

                // Call a private method to put the message onto another queue
                putMessage(messageID, text);
        }
        catch  (Exception err)
        {
                err.printStackTrace();
        }
        return;
}

下一步做什么

在开发企业应用程序以使用消息驱动的 bean 之后,请配置并部署该应用程序。例如,为消息驱动的 bean 定义激活规范,并可以选择更改此应用程序的部署描述符属性。有关更多信息,请参阅部署企业应用程序,以便将消息驱动的 Bean 与遵从 JCA 1.5 的资源配合使用部署企业应用程序以便将消息驱动的 Bean 与侦听器端口配合使用

指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tmb_devap
文件名:tmb_devap.html