您的位置:首页 >> 编程开发 >> Java >> JavaBeans >> 正文
RSS
 

全面研读EJB2.0(6)

http://www.rdxx.com 01年11月17日 11:08 互联网 我要投稿

关键词: EJB

 

全面研读 EJB 2.0
2001-04-05· --·wsdn

  JMS 和 MessageDrivenBean

  虽然大多数 JMS 厂商都提供消息中介工具,来将消息从发送者路由到接收者,但构建使用(接收)消息的 JMS 客户机却是应用程序开发人员的职责。在许多情况下,接收消息的应用程序必须强健、安全、快速而且可伸缩;它需要的基础结构基本上与 EJB 应用程序相同。

  由于认识到这种需要,EJB 2.0 现在包括了 MessageDrivenBean 类型,它可以使用 JMS 消息,并且在同一个强健的、基于组件的基础结构中处理这些消息,这样的基础结构对于会话 bean 和实体 bean 都非常有用。MessageDrivenBean 类型(消息 bean)是一种企业级 bean 组件,它设计来使用异步的 JMS 消息。

  除了提供容器基础结构以外,EJB 还具有另一个重要的优点:并发处理。在 EJB 中,一个已部署的消息 bean 表示一个单一的消息使用者,但这个 bean 本身是由许多 bean 实例提供服务的。每个 bean 实例都可以分别地使用消息 bean 接收到的消息。这意味着,消息 bean 不必像常规 JMS 客户机那样连续地使用消息。消息 bean 可以并发地使用接收到的多个消息,这样就能达到比传统 JMS 应用程序高得多吞吐量和好得多的可伸缩性。

  为了说明消息 bean 的作用,就开发了 MarketingBean 类,并将它从订单主题中部署到供使用的消息中去。MarketingBean 将从消息中提取 OrderDetail 对象,并使用它将客户添加到适当的目录邮寄名单中。这是一种最精致的大量邮寄系统。

  下面是 MarketingBean 类的定义,这个类使用发布给订单主题的消息。

  public class MarketingBean implements
    javax.ejb.MessageDrivenBean {

     public void onMessage(Message message) {

      ObjectMessage orderMessage = (ObjectMessage)orderMessage:
      OrderDetail orderDetail = (OrderDetail)orderMessage.getObject();

      Integer customerID = orderDetail.getCustomerID();

      InitialContext jndiEnc = new InitialContext();
      CatalogHome catalogHome = (CatalogHome)jndiEnc.lookup("java:comp/env/ejb/catalog");

      Iterator productIDs = orderDetail.getProductsIDs();
      while(productIDs.hasNext()){
       Integer productID = (Integer)productIDs.next();
       Catalog cat = CatalogHome.findByProductID(productID);
       cat.addCustomerToMailingList(customerID);
      }
     }
    }

正像会话 bean 和实体 bean 一样,MessageDrivenBean 也是一种完备的企业级 bean,但其间仍存在一些重要的区别。消息 bean 没有远程接口或本地接口。这是因为消息 bean 不是 RPC 组件。它没有供 EJB 客户机调用的业务方法。消息 bean 监听虚拟消息通道(主题或队列),并使用其它 JMS 客户机发送给该通道的消息。

  各个消息 bean 构成一个 bean 类,这个类实现 MessageDrivenBean 接口和一个 XML 部署描述符。下面是 MessageDrivenBean 接口的定义,所有消息 bean 都必须实现这个接口。

  package javax.ejb;
  import javax.jms.Message;
  import javax.jms.MessageListener;

  public interface MessageDrivenBean extends
   MessageListener{
    public void onMessage(Message message);
    public void ejbCreate();
    public void ejbRemove();
    public void
     setMessageDrivenContext(MessageDrivenContext mdc);
   }

当部署了一个消息驱动的 bean 以后,它就被指派来处理特定主题或队列中的消息。JMS 客户机(Java 应用程序、bean 或本地客户机)发送的任何消息,将由消息路由器转发给消息 bean,该消息 bean 正是被指派来从该虚拟通道中接收消息的。当一条消息被发送给一个消息 bean 时,EJB 容器就会从某个池中选择该 bean 的一个实例,来处理这条消息。当 bean 实例调用其 onMessage() 方法时,它就会接收到这条消息,并能够以它认为合适的任何方式来处理这条消息。一旦这条消息被使用,则只要事务没有异常中止,这条消息都不会被传送给这个消息 bean 的任何其它实例。

共2页  第1页 第2页

 
 
标签: EJB 打印本文
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站