消息驱动EJB(一)JMS与EJB

本文 主要从两方面进行讲述:

1.为什么使用MDB

2.使用MDB的设计原则

先来看一下消息之间是如何通信的?

应用的一个组件将JMS消息发送指定消息目的,应用的另一个组件从消息目的读取消息并解析出消息的内容。这样就实现了两个组件之间的通信。

1、发送消息的一方,称为消息生产者

2、接收消息的一方,称为消息消费者

消息生产者和消息消费者无须直接耦合,甚至不需要知道对方的存在,这就是JMS规范所实现的效果。

(一)JMS和EJB

1、消息生产者

要实现的功能比较单一,只要获取与消息目的的JMS会话,然后通过JMS会话将消息发送至指定消息目的即可。由任何JavaEE组件来充当,Web组件、EJB组件均可。

2、消息消费者

如果是同步消费者,消息消费者从消息目的读不到消息,那么会导致当前线程被阻塞,无法向下执行。所以以异步消费者使用居多。

异步消费者(居多),则需要一直监听消息目的,当JMS消息被送达消息目的时,消息异步消费者被触发,进而读取消息目的地的消息,并对消息进行处理。

3、对比

消息生产者:发送的消息是‘不连续的’。开发者只需要将发送消息的步骤定义成一个方法,当程序需要发送消息时,调用该方法发送即可。

消息消费者:随着应用的启动而启动(需要开发者额外完成),一直监听消息目的地的所有消息。

4、MDB的由来

为了更好地实现异步消费者,JavaEE制定了消息驱动Bean(MDB)规范,MDB本质上就是一个异步消费者,MDB运行在EJB容器中,客户端程序一般无法直接调用MDB。MDB的作用就是负责监听指定消息目的。

MDB的作用非常简单:简化开发,当开发者需要通过JMS消息机制进行通信时,JMS消息生产者按原来的方式发送消息;而MDB规范则简化开发了JMS异步消费者的开发。

只需要实现一个onMessage(Message  msg)方法【无需获取JMS连接,无须获取JMS Session,当然也无须理会MDB何时启动】。EJB容器会自动启动MDB来监听消息目的,当JMS消息被送达指定JMS消息目的时,MDB的方法就被触发,进而读取消息,进而读取消息,获取消息并进行处理。 而开发者只需要通过Annotation来指定JMS消息目的、消息目的的类型即可。

(二)使用MDB的设计原则

消息驱动Bean(Message Driven Bean)是EJB和JMS的整合产品,是由无状态的SessionBean变化而来。

1、与无状态的SessionBean相比

(1)相同点:

均存在于EJB容器之中,而且可以利用EJB提供的系统服务,如:事务、安全和并发控制等。

它们都不会保存客户端的调用状态,可被多个客户端共享等。

从功能上来看,都将作为用程序的业务逻辑组件来使用,因此MDB通常不会直接访问数据库,而是依赖于底层的EAO组件访问数据库。

(2)不同点:

但MDB不直接与客户端交互

2、通信方式的区别

客户端和无状态SessionBean的通信方式是直接调用,是一种同步的通信方式。在业务方法返回之前,客户端线程被阻塞,无法继续执行。

客户端和MDB的通信方式是间接的,是一种异步的通信方式。因为消息生产者只是将一个消息发送至指定的消息目的,至于MDB何时被触发,触发之后会如何处理这个消息,处理需要多上时间,消息生产者无须理会。因为不会阻塞消息生产者的执行线程。它只是一个消息监听器。

相比较而言,MDB的通信效率更高一些!但无状态SessionBean会更加可靠。

当客户端调用无状态SessionBean方法抛出异常时,客户端可以立刻获得该异常及异常的信息;

而客户端间接调用MDB时并非如此,客户端不会获得该异常及异常的信息。

3、适用场景

一般来讲,无状态的SessionBean用于定义业务逻辑,是整个应用的Facade,而应用程序的控制器组件调用它的业务方法进行处理。

如有些业务方法满足如下特征,则考虑使用MDB

1、该业务的处理时间较长,而且处理时间可能具有一定的不确定性。

2、客户端调用该方法处理后无需立即得到返回结果。

而MDB本质上是一个消息监听器。从功能上划分,应该属于控制器角色,因此不推荐在MDB的conMessage()方法中完成复杂的业务处。

若某个业务方法处理起来比较耗时,而且客户端调用该方法后无需立刻得到返回结果。我们依然在某个SessionBean中定义该方法,但客户端并不直接调用该方法。客户端只是将需要调用该方法的参数以JMS消息的方式发送至指定目的地,此时监听该消息目的地的MDB的onMessage()方法会被处罚,再由MDB的onMessage()方法来调用在该SessionBean中定义的该方法。

这样就可以把MDB的功能明确下来,它是一种特殊的控制器,而不应该定义成业务逻辑组件。

总结:

本文以消息之间的通信为起点介绍如下内容:

JMS消息系统中的组件分为:

JMS消息生产者:发送消息、不连续

JMS消息消费者:接收消息、一直监听消息

同步:易阻塞、效率低、更可靠(可立即获取异常信息)

异步:不易阻塞、效率高、不可靠

【MDB】属于异步消息消费者。简化开发、被看做是一种特殊的控制器。

时间: 2024-10-27 13:22:17

消息驱动EJB(一)JMS与EJB的相关文章

Intellij IDEA 创建消息驱动Bean - 接收JMS消息

除了同步方式的调用之外,有时还需要异步调用,用来处理不需要即时处理的信息,例如短信.邮件等,这需要使用EJB中的独特组件——消息驱动Bean(Message-Driven Bean,MDB),它提供了Java消息服务JMS(Java Messaging Service)的处理能力,由消息驱动Bean来处理JMS消息.JMS的消息由客户端程序产生,并被发布到服务器的消息队列,消息驱动Bean随之检索消息并执行其内容.这种事件或者数据的通信就称为异步形式,客户端或者服务端Bean都无须依赖对方的直接

J2EE的十三个技术——EJB之消息驱动JMS

JMS--Java Message Service JAVA的消息服务,消息可实现两端通信. 用于访问面向消息中间件的标准api,他提供与厂商无关的访问方法,以访问消息收发服务. 特点:即使其中一方不可用,仍不影响通信,将消息排队使得性能更快. 消息组成: Header+Properties+Body (头字段)     (属性)         (消息体) JMS客户机 生产或消费消息的JAVA程序 Connection Factory(连接工厂) 管理员创建,客户端使用JNDI查找连接工厂,

EJB3.0 EJB开发消息驱动bean

(7)EJB3.0 EJB开发消息驱动bean JMS 一: Java消息服务(Java Message Service) 二:jms中的消息 消息传递系统的中心就是消息.一条 Message 由三个部分组成:             头(header),属性(property)和主体(body). 消息有下面几种类型,他们都是派生自 Message 接口.           StreamMessage:一种主体中包含 Java 基元值流的消息.其填充和读取均按顺序进行.          

远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比

总结这些概念都是易混淆,最基本概念定义复习和深入理解,同时也是架构师必备课程 RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果.这个请求包括一个参数集和一个文本集,通常形成"classname.methodname"形式.优点是跨语言跨平台,C端.S端有更大的独立性,缺点是不支持对象,不支持异步调用,无法在编译器检查错误,只能在运行期检查. Web Service Web Service

EJB3.0(三)JMS及EJB中的message-driven bean

为什么是这个标题呢?因为EJB的Message-driven bean基于JMS来实现的.在说明Message-driven bean之前需要来了解一下jms. JMS java-message-service,java程序和企业级应用交互的一套规范,定义一组用于创建.发送.以及接受消息的API.发送者不需要知道接受者的任何内容,接受者也是同样.对于双方都是一种透明的方式来进行异步交互.J2ee1.3版本开始支持JMS,而JMS主要提供了一种标准的底层消息通信的规范.JMS有两种消息模型,p2p

EJB_消息驱动发展bean

消息驱动发展bean Java信息服务(Java MessageService) Java 信息服务(Java Message Service,简称 JMS)是用于訪问企业消息系统的开发商中立的API. 企业消息系统能够协助应用软件通过网络进行消息交互. JMS的编程过程非常easy,概括为:应用程序A发送一条消息到消息server的某个目地(Destination),然后消息server把消息转发给应用程序B. 由于应用程序A和应用程序B没有直接的代码关连,所以两者实现了解偶. JMS中的消息

(j2ee)消息驱动bean

消息驱动bean的主要用于接受和处理异步消息,这些信息可能来自一个外部的系统或者同一个应用中的其它组件,之所以称它们为异步,那时因为这些消息可以在任何时候到达,而不同于一般的远程方法调用的结果,是立马直接得到的.同UI的事件处理工作方式类似,消息驱动bean用于监听发送给它的异步消息.值得注意的是,与远程调用方法不同,异步消息的发送者不会停下来去等待对方的响应. 消息驱动bean是J2EE中的一个标准服务(工具),全称是Java Message Service API,简称为JMS.Java M

消息驱动bean(MDB)实例

到目前为止前面介绍的有关JavaEE的东西都是同步的,也就是说调用者调用某个方法,那么这个方法必须立即执行并返回执行结果.用官方一些的语言来说就是"客户端通过业务接口调用一个方法,在将控制权返回给客户端之前,服务器完成该方法调用".对于我们接触到的大多数操作而言这是最自然也是最容易实现的方法.然而,有些情况下客户端并不需要等待服务器响应,而只需要告诉服务器应该做什么就可以了,在完成"告知"任务之后客户端能够继续工作,而服务器则默默的在一旁处理客户端的请求(通常会是很

深入了解EJB (三)EJB是什么以及规范之间的内在联系

J2EE是一个很大的概念它主要包括了十三个技术规范,除了这十三个外还有一些其他一些规范但不太重要不需要关注,每个规范如果深入研究的话都包括了很多内容,这里不是逐一分析每一个规范的含义,只是谈谈J2EE规范里面几个规范的作用和对企业级开发的一点点理解,如有不恰当支持请指正. 十三个规范的核心是EJB(enterprise java bean),因此有必要重点分析一下ejb规范,以前ejb还没有向今天这么辉煌时,ejb1.0问世的时候里面仅仅有ejb.rmi等几个简单规范,也仅仅解决了当时分布式应用