在之前的文章中我们介绍了带你走进EJB--JMS带你走进EJB--JMS编程模型 对JMS有了初步的了解, 作为EJB系列的文章我们会继续对EJB相关的内容做进一步深的学习和了解.而此次需要进行的是MDB.

MDB(Message DrivenBean)消息驱动Bean.它是EJB跟JMS的一个整合,跟SessionBean 一样,MDB是由EJB容器进行管理,同时也可以利用EJB所提供的系统服务诸如事务,安全等.

我们可以通过MDB的规范,能够使用更为简洁的方式来开发JMS异步消费者,作为开发者需要的是去实现onMessage方法即可,你不需要去获取JMS链接,不需要JMS Session,也不需要关心MDB启动,因为这些EJB容器会帮你来做,需要做的是通过Annotation来制定JMS消息的目的和类型即可.

因为MDB是从无状态的Session Bean 发展过来的,所以他们两个有很相似的地方.而在这里我们需要了解他们的不同即可.

无状态Session Bean提供了业务接口,客户端需要通过同步的方式来调用无状态的Session Bean .是一种同步的通讯方式.

MDB不需要客户端直接调用,它是一个消息监听者.是一种异步的通讯方式.

接下来我们通过一个MDB的例子来具体展示如何使用MDB.因为我们已经知道MDB不需要直接面向客户端,所以它不需要定义任何借口(跟Session Bean对比,它需要一个定义接口,为客户端服务.),一个Bean类即可,同时因为要做为消息监听器使用,因为要去实现MessageListener接口.


	package com.tgb.ejb;

	import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage; @MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",propertyValue="queue/myqueue")
}
)
public class MyQueueMDBBean implements MessageListener { public void onMessage(Message msg) {
try {
TextMessage textMessage = (TextMessage)msg;
System.out.println("MyQueueMDBBean被调用了【"+textMessage.getText()+"】");
} catch (JMSException e) {
e.printStackTrace();
}
} }

上面的MDB在收到JMS消息之后只是简单的或许了JMS消息中的信息,它并没有调用SessionBean来处理所接受到的信息.

将此MDB编译并部署到JBoss应用服务器中,它就可以监听JDNI为queue/myqueue的消息目的.

接下来我们需要开发一个应用程序来向JBoss服务器的消息目的发送消息.客户端如下:

package com.tgb.ejb;

import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.naming.NamingException; public class MyQueueBeanClient { /**建立Queue 客户端
* @param args
* @throws NamingException
* @throws JMSException
*/
public static void main(String[] args) throws NamingException, JMSException {
InitialContext context = new InitialContext();
//创建QueueConnectionFactory
QueueConnectionFactory factory=(QueueConnectionFactory)context.lookup("ConnectionFactory"); //创建QueueConnection
QueueConnection queueConnection= factory.createQueueConnection(); //创建QueueSession
QueueSession queueSession =queueConnection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); //获取Destination对象
Queue queue = (Queue)context.lookup("queue/myqueue");
//创建文本对象
TextMessage textMessage = queueSession.createTextMessage("hello world!"); //创建发送者
QueueSender sender = queueSession.createSender(queue); //发送消息
sender.send(textMessage); //关闭资源
queueSession.close();
queueConnection.close(); System.out.println("消息已发送"); } }

运行客户端我们就向JMS 的消息目的地发送一个简单的文本消息.随后MDB会被出发,以下是效果

小结:通过上面的实例我们能够看到,虽然客户端不能直接与EJB交互,但是依然能够跟它进行通讯,这是一种低耦合的方式通讯.虽然本实例获取消息之后仅仅简单的在控制台上打印消息,但在实际的项目中MDB会获取JMS消息中的信息之后需要调用Session Bean对信息进行处理,例如在用户注册信息之后通知用户并发送相关的邮件信息.这个业务可以通过MDB来完成,只需要通过依赖注入将Session Bean注入此MDB中即可.

在进行的过程中还会出现一个NameNotFoundException的问题,在下一篇文章中对此进行解决.

带你走进EJB--MDB的更多相关文章

  1. 小丁带你走进git的世界三-撤销修改

    一.撤销指令 git checkout还原工作区的功能 git reset  还原暂存区的功能 git clean  还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 g ...

  2. 小丁带你走进git的世界二-工作区暂存区分支

    小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git  init git  clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...

  3. 小丁带你走进git世界一-git简单配置

    小丁带你走进git世界一-git简单配置 1.github的简单配置 配置提交代码的信息,例如是谁提交的代码之类的. git config  –global user.name BattleHeaer ...

  4. 老司机带你走进Core Animation

    为什么时隔这么久我又回来了呢? 回来圈粉. 开玩笑的,前段时间ipv6被拒啊,超级悲剧的,前后弄了好久,然后需求啊什么的又超多,所以写好的东西也没有时间整理.不过既然我现在回来了,那么这将是一个井喷的 ...

  5. 带你走进rsync的世界

    导读 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录.rsync共有3种使用方 ...

  6. 小丁带你走进git的世界三-撤销修改(转)

    一.撤销指令 git checkout还原工作区的功能 git reset  还原暂存区的功能 git clean  还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 g ...

  7. Miox带你走进动态路由的世界——51信用卡前端团队

    写在前面: 有的时候再做大型项目的时候,确实会被复杂的路由逻辑所烦恼,会经常遇到权限问题,路由跳转回退逻辑问题.这几天在网上看到了51信用卡团队开源了一个Miox,可以有效的解决这些痛点,于是乎我就做 ...

  8. 带你走进CSS定位详解

    学习CSS相关知识,定位是其中的重点,也是难点之一,如果不了解css定位有时候都不知道怎么用,下面整理了一下关于定位属性的具体理解和应用方案. 一:定位 定位属性列表 position top bot ...

  9. 大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)

                                                        大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5) 上一节中,我们讲 ...

随机推荐

  1. 使用mobile jQuery 动态给select下拉添加数据,选中项默认不显示的解决方法。

    getaddress(); function getaddress(type=0,parent='') { var tid=1; $.ajax({ type: "post", ur ...

  2. Linux各个发行版本的介绍, 以及VirtualBox+CentOS的安装步骤

    Linux和Unix系统有哪些主要的发行版本 Unix: (非开源传统商业操作系统) IBM AIX, HP HP-UX, Sun Solaris,等 各家硬件厂商的发行版本, 往往是和自家的硬件设备 ...

  3. springmvc的ModelAndView的简单使用

    参考:http://blog.csdn.net/zzjjiandan/article/details/34089313 先上图: MAVTest.java package com.wyl; impor ...

  4. (iOS)关于GCD死锁的问题

    - (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_main_queue(), ^{NSLog("); ...

  5. Word2Vec在Tensorflow上的版本以及与Gensim之间的运行对比

    接昨天的博客,这篇随笔将会对本人运行Word2Vec算法时在Gensim以及Tensorflow的不同版本下的运行结果对比.在运行中,参数的调节以及迭代的决定本人并没有很好的经验,所以希望在展出运行的 ...

  6. MOSS 2010 无法同步用户配置文件

    The management agent “MOSSAD-Synch AD Connection” failed on run profile “DS_DELTAIMPORT” because of ...

  7. stl 迭代子的失效

    迭代子是STL中很重要的特性,但是其很脆弱(我个人认为),因为使用它的条件很苛刻,一不小心就失效了.其在两中情况下可能会失效. 1.当容器有插入操作时 在初始化了迭代子后,如果容器有插入操作时,迭代子 ...

  8. 给即将面临Noip的二班同学

    给即将面临Noip的二班同学: 我们共同走过了一年,在这里,真正认识彼此…… 失落过,但更多是欢笑…… 或许我们班的信息学竞赛承受着巨大的压力,但正因为这样,我们才学会了坚持:或许我们得不到他人的认可 ...

  9. 借助树的概率dp(期望)+数学-好题-hdu-4035-Maze

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4035 题目意思: 有n个房间,有n-1条通道连接这n个房间(每两个房间之间有且只有一条路,所以实际上 ...

  10. 关于css的默认宽度

    <div class="boxa"> <div class="boxb">我是div</div> </div> ...