在之前的文章中我们介绍了带你走进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. hdu4099

    要想通这个题目应该很容易,由于斐波纳契数在近100项之后很大,早就超出long long了.而输入最长的序列才40个数字,所以大约保留前50位,前40位是没有误差的!!!其实,想想我们判断double ...

  2. java——数据库——commons-DbUtils

    Apache Commons DbUtils Tutorial The Apache Commons DbUtils library is a small set of classes designe ...

  3. Toast的替代者Snackbar

    在Android design support library中,SnackBar的使用: Part 2 – Welcome Snackbar, Goodbye Toast! BY PARESH MA ...

  4. codeforces 589F. Gourmet and Banquet 二分+网络流

    题目链接 给你n种菜, 每一种可以开始吃的时间不一样, 结束的时间也不一样. 求每种菜吃的时间都相同的最大的时间.时间的范围是0-10000. 看到这个题明显可以想到网络流, 但是时间的范围明显不允许 ...

  5. NodeJS 从0开始

    查看Node 基本配置$ npm config ls -l $npm help install将展开install的help文档 初始化目录 npm init 根据提示完成 将生成package.js ...

  6. 批处理[Batch]

    批处理 1. 定义:就是一堆DOS命令按一定顺序排列而形成的集合. 英文译为BATCH,批处理文件后缀BAT就取的前三个字母. 示例1:a.bat @echo off Netstat –a –n &g ...

  7. Qt信息隐藏(Q_D/Q_Q)介绍——从二进制兼容讲起

    http://www.cnblogs.com/SkylineSoft/articles/2046404.html

  8. Wide character in print at hcp.pl line 21.

    jrhmpt01:/root# cat -n hcp.pl 1 use LWP::UserAgent; 2 use Encode; 3 $ua = LWP::UserAgent->new; 4 ...

  9. HDU 2588 GCD

    题目大意:给定N,M, 求1<=X<=N 且gcd(X,N)>=M的个数. 题解:首先,我们求出数字N的约数,保存在约数表中,然后,对于大于等于M的约数p[i],求出Euler(n/ ...

  10. 重拾CSS基础—开篇

    由来 从事软件行业一晃也5年有余,之间参与过若干个基于web的项目,所以javascript和Html基本已经相当熟悉,最近对于web前端开发比较关注,分析后发现CSS的确是自己的弱项,于是决定再加强 ...