开发企业应用程序以使用消息驱动的 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 的相应方法。
public class MyJMSppMDBBean implements MessageDrivenBean, javax.jms.MessageListener
如果消息驱动的 bean 还实现了 javax.ejb.TimedObject 接口并通过调用 void ejbTimeout(Timer) 对计时器回调方法进行了调用,那么可向 EJB 定时器服务注册消息驱动的 bean 以获取基于时间的事件通知。在预设时间,容器会调用消息驱动的 bean 的 ejbTimeout 方法。
- 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)
此方法包含用于处理所接收的时间事件的业务逻辑,仅当支持计时器服务的通知才需要。
过程
结果
示例
以下示例说明如何创建消息驱动的 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;
}