首页 > 代码库 > 消息驱动EJB(一)JMS与EJB

消息驱动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】属于异步消息消费者。简化开发、被看做是一种特殊的控制器。

               

 

 

 

消息驱动EJB(一)JMS与EJB