首页 > 代码库 > EJB初级篇--EJB组件之消息驱动Bean
EJB初级篇--EJB组件之消息驱动Bean
会话Bean部署在服务端的JBoss中,然后客户端程序Java或者JSP调用服务端的JNDI服务,即可实现会话Bean的调用。可以说会话Bean实现了服务的分布式调用。可是这种调用采用的是同步方式,即客户端和服务端的调用时同步进行的。如下图所示:
为什么说远程方法调用时同步的呢?通常,在服务器完成客户请求前,它一直处于等待(阻塞)状态。只有在服务器处理完请求后,客户才能够接受到执行结果,从而继续执行,这就是同步执行。
可是这种情况显然对于用户体验来说是极其不好的。用户不需要管服务器端处理他的请求需要多长时间,他只需要他可以方便快捷的完成他想要的工作就好。说到这里有没有联想到什么?是的,就是AJAX,它的出现就是为了解决这种因同步方式而带给用户不便的问题。那么在EJB中又是如何解决这个问题的呢?没错,就是我们本篇博文的主要内容---消息驱动Bean。
如下图所示,消息取代了远程方法调用,可以将消息想象成客户和服务器间存在的“中间人”。中间人从若干消息生产者接受消息,然后将这些消息广播给若干消息消费者。由于中间人的存在,使得消息生产者能够在发送消息后继续执行。这样整个过程就是异步编程。
而支持这种消息处理的基础框架我们可以称之为MOM(Message-Oriented Middleware:面向消息中间件)。可是各个MOM系统都是专有的,它们都有各自的API,这使得最终用户被所锁定在特定厂商上,不易于移植和学习。这时候就出现了JMS(Java Message Service:Java消息服务),它是一种消息标准,使得开发人员只需要学习JMS API即可,而且符合JMS规范的消息代码都能够在不同MOM间实现灵活移植。
关于JMS如何创建、发送或接受消息我们再此不做详细介绍了,仅以一图来供大家了解。
大概了解了JMS,那么JMS究竟和EJB是如何结合使用的呢?我们本篇介绍的MDB就是基于JMS的EJB组件--消息驱动Bean。但是我们需要注意的是,MDB组件不仅能够接受JMS消息,还能够接受其他类型的消息。不管是什么类型的消息,一旦来到,EJB容器就将调用MDB实例去处理它。
由上图我们可以看到,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