带你走进EJB--MDB
在之前的文章中我们介绍了带你走进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的更多相关文章
- 小丁带你走进git的世界三-撤销修改
一.撤销指令 git checkout还原工作区的功能 git reset 还原暂存区的功能 git clean 还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 g ...
- 小丁带你走进git的世界二-工作区暂存区分支
小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git init git clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...
- 小丁带你走进git世界一-git简单配置
小丁带你走进git世界一-git简单配置 1.github的简单配置 配置提交代码的信息,例如是谁提交的代码之类的. git config –global user.name BattleHeaer ...
- 老司机带你走进Core Animation
为什么时隔这么久我又回来了呢? 回来圈粉. 开玩笑的,前段时间ipv6被拒啊,超级悲剧的,前后弄了好久,然后需求啊什么的又超多,所以写好的东西也没有时间整理.不过既然我现在回来了,那么这将是一个井喷的 ...
- 带你走进rsync的世界
导读 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录.rsync共有3种使用方 ...
- 小丁带你走进git的世界三-撤销修改(转)
一.撤销指令 git checkout还原工作区的功能 git reset 还原暂存区的功能 git clean 还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们 g ...
- Miox带你走进动态路由的世界——51信用卡前端团队
写在前面: 有的时候再做大型项目的时候,确实会被复杂的路由逻辑所烦恼,会经常遇到权限问题,路由跳转回退逻辑问题.这几天在网上看到了51信用卡团队开源了一个Miox,可以有效的解决这些痛点,于是乎我就做 ...
- 带你走进CSS定位详解
学习CSS相关知识,定位是其中的重点,也是难点之一,如果不了解css定位有时候都不知道怎么用,下面整理了一下关于定位属性的具体理解和应用方案. 一:定位 定位属性列表 position top bot ...
- 大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)
大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5) 上一节中,我们讲 ...
随机推荐
- 最新版SDWebImage的使用
我之前写过一篇博客,介绍缓存处理的三种方式,其中最难,最麻烦,最占内存资源的还是图片缓存,最近做的项目有大量的图片处理,还是采用了SDWebImage来处理,但是发现之前封装好的代码报错了.研究发现, ...
- selenium css(转)
如果button上有class属性的,如: <button id="ext-eng=1026" class="x-right-button"...&g ...
- 原生js动态改变dom高度
item参数为要改变高度的dom,maxHight参数为dom的最大高度,speed参数为改变高度的速度function addHeight(item,maxHight,speed){ var ite ...
- 一个关于css3背景透明的例子
大家都知道使用opacity调节透明度不仅是背景透明了而且选择区域的文字也跟着透明了, 这是我们不想要的效果,于是强大的css3便有了只让背景透明的功能 那就是background:rgba(0,0, ...
- linux 怎么查找oracle11g的安装目录
一般来说,/etc/oraInst.loc文件里会记录oracle的路径,如[oracle@ruby ~]$ cat /etc/oraInst.loc inventory_loc=/u01/app/o ...
- file_get_contents 超时设置
<?php $ctx = stream_context_create( array( 'http' => array( 'timeout' => 1 //设置一个超时时间,单位为秒 ...
- 灰度直方图及处理“cvQueryHistValue_1D”: 找不到标识符”的问题(上)
// HIstogram.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "opencv2/opencv.hpp ...
- C++STL之string (转)
在学习c++STL中的string,在这里做个笔记,以供自己以后翻阅和初学者参考. 1:string对象的定义和初始化以及读写 string s1; 默认构造函数,s1为空串 string ...
- 基于ZooKeeper的Dubbo简单抽样登记中心
一:设备zookeeper 系统环境 Ubuntu 14.04.2 LTS x64 IP : 192.168.1.102 下载zookeeper-3.4.6.tar.gz到文件夹/opt.拉开拉链 m ...
- codeforces #260 DIV 2 C题Boredom(DP)
题目地址:http://codeforces.com/contest/456/problem/C 脑残了. .DP仅仅DP到了n. . 应该DP到10w+的. . 代码例如以下: #include & ...