首页 > 代码库 > EJB初级篇--EJB组件之消息驱动Bean

EJB初级篇--EJB组件之消息驱动Bean

     会话Bean部署在服务端的JBoss中,然后客户端程序Java或者JSP调用服务端的JNDI服务,即可实现会话Bean的调用。可以说会话Bean实现了服务的分布式调用。可是这种调用采用的是同步方式,即客户端和服务端的调用时同步进行的。如下图所示:

计算机生成了可选文字:选程方法调川:、应用,

     为什么说远程方法调用时同步的呢?通常,在服务器完成客户请求前,它一直处于等待(阻塞)状态。只有在服务器处理完请求后,客户才能够接受到执行结果,从而继续执行,这就是同步执行

     可是这种情况显然对于用户体验来说是极其不好的。用户不需要管服务器端处理他的请求需要多长时间,他只需要他可以方便快捷的完成他想要的工作就好。说到这里有没有联想到什么?是的,就是AJAX,它的出现就是为了解决这种因同步方式而带给用户不便的问题。那么在EJB中又是如何解决这个问题的呢?没错,就是我们本篇博文的主要内容---消息驱动Bean

     如下图所示,消息取代了远程方法调用,可以将消息想象成客户和服务器间存在的“中间人”。中间人从若干消息生产者接受消息,然后将这些消息广播给若干消息消费者。由于中间人的存在,使得消息生产者能够在发送消息后继续执行。这样整个过程就是异步编程

计算机生成了可选文字:消息:、应用、消息中间件,应用衬

     而支持这种消息处理的基础框架我们可以称之为MOMMessage-Oriented Middleware:面向消息中间件)。可是各个MOM系统都是专有的,它们都有各自的API,这使得最终用户被所锁定在特定厂商上,不易于移植和学习。这时候就出现了JMSJava Message ServiceJava消息服务),它是一种消息标准,使得开发人员只需要学习JMS API即可,而且符合JMS规范的消息代码都能够在不同MOM间实现灵活移植。

     关于JMS如何创建、发送或接受消息我们再此不做详细介绍了,仅以一图来供大家了解。

计算机生成了可选文字:IM50目v"(I肠。tRuntlm.脚5扣甲阳rQueuel2:Cr朗IeC侧In氏石on.MS(onn"t口on.}.}.}囚."t。叮y,口d目七讨M。月.乒〔O翻.目.业以如.QueueZ.1.1.}.jMS(onn"tion下帅i〔1盖念悦///5二C『ea睡P10dUt吧r田CO川叨门与er.1.1.}.(11..tIMS5.”肠.,二触山e、吧IMSDri钾r(C的n鱿l沁n「长协甲)6丁srndorR代已句eM,"age,阴5卜.山“甘口甲,MS(。”翎二4:LookupIMSDe眺Inoli的JNDIN确11195阶‘.Sutha,LDAP

 

     大概了解了JMS,那么JMS究竟和EJB是如何结合使用的呢?我们本篇介绍的MDB就是基于JMSEJB组件--消息驱动Bean。但是我们需要注意的是,MDB组件不仅能够接受JMS消息,还能够接受其他类型的消息。不管是什么类型的消息,一旦来到,EJB容器就将调用MDB实例去处理它。

 

计算机生成了可选文字:EIBserverMes分ge·Dr沁enBeanP001SendslPUblisheS(Ii.nt:一,一o·.…}‘ean,n,ta"es{jMSOotln跳肠.TheE!Bcontainerisacon,umer成me,,agesfrom】MSD“加at化的as5伴cifiedbythedep沁ye,int阮dep拓ym佗ntdescriptor.

     由上图我们可以看到,MDB和发送消息的客户处于松耦合的关系,客户不能够借助于业务接口访问到MDB,也就是客户不能引用MDB,也不能够同它直接交互。客户需要借助于消息提供者提供的API(如JMS)发送消息,然后接受到该消息MDB将负责处理它。

 

     知道什么是MDB了,下面就来说说MDB具体特征吧。

1)不存在远程或者本地业务接口;

     会话Bean中业务接口分为远程和本地两种业务接口以供客户端调用。但是在MDB中则不存在。因为MDB只是处理来自消息客户发送而来的消息,开发者不需要调用MDB,所以就不需要MDB具有业务接口。

2)无状态的;

     MDB和无状态会话Bean类似在会话状态上是类似的,两者都没有会话状态。所有的MDB实例都是匿名的,EJB容器对所有MDB实例一视同仁

3)单线程的;

     在同一时刻,单个MDB实例仅能处理单个消息。那么它是如何来实现并发操作的呢?EJB容器会在池中维护多个MDB实例,并且负责将消息排好队,分发给MDB实例处理,从而提供并发消费消息的能力。

4)支持各种用于消息分发的监听器方法;

     MDB只是从目的地或者资源适配器接受消息,它对于消息的具体内容并不知情。那么它是如何确定使用了正确的MDB组件呢?是EJB容器来完成的。EJB容器会调用MDB所实现的监听接口中的某些方法,这些方法将会接受到消息(如JMS消息)。然后开发者在实现这些方法(如JMS API消息监听接口的onMessage()方法)时,会采用if语句判断消息类型,然后针对它进行处理。

 

     以上是我现在了解的一些关于MDB的理论知识,不知道你明白了一些吗?

EJB初级篇--EJB组件之消息驱动Bean