除了在第 2 章,客户端编程模型介绍的通用 JMS 客户端编程模型外,还有专用于 J2EE 平台应用程序上下文中的 JMS 客户端。这种专用的客户端称为消息驱动 Bean,它是 Enterprise JavaBeans (EJB) 2.0(和更高版本)规范 (http://java.sun.com/products/ejb/docs.html) 中描述的 EJB 系列组件之一。
消息驱动 Bean 提供异步消息传送;而其他 EJB 组件(会话 Bean 和实体 Bean)只能通过标准的 EJB 接口同步调用。但是,企业应用程序通常需要异步消息传送,以便服务器端组件能够在不占用服务器资源的情况下相互通信。服务器端组件必须响应应用程序事件的任何应用程序需要这样一种 EJB 组件:不需要紧密耦合到消息生成方即可接收和使用消息。在企业应用程序中,这种能力还必须在负载增加时扩展。
消息驱动 Bean (Message-driven Bean, MDB) 是由专用的 EJB 容器(为所支持的组件提供分布式服务)支持的 EJB 组件。
JMS 消息驱动 Bean 是用于实现 JMS MessageListener 接口的 EJB。当 MDB 容器接收到消息时,将调用 onMessage 方法(由 MDB 开发者编写)。onMessage() 方法使用消息的方式与标准 MessageListener 对象的 onMessage() 方法使用消息的方式一样。不能像对其他 EJB 组件那样远程调用 MDB 的方法。因此,不存在与它们关联的主接口或远程接口。MDB 可使用来自单一目的地的消息。如图 5–1 所示,独立 JMS 应用程序、JMS 组件、EJB 组件或 Web 组件均可生成消息。
专用的 EJB 容器支持 MDB。它将创建 MDB 的实例,并对这些实例进行设置以便异步使用消息。该容器与消息服务(包括验证)建立连接,创建与给定目的地关联的会话池,并管理池中会话之间的消息分发。由于该容器控制 MDB 实例的有效期,因此它通过管理 MDB 实例池来容纳传入的消息负载。
与 MDB 关联的是部署描述符,它指定容器在设置消息使用时所使用的连接工厂和目的地的属性。部署描述符还可以包括部署工具配置容器所需的其他信息。每个这样的容器都支持单个 MDB 的实例。