在之前的文章中我们介绍了带你走进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();//创建QueueConnectionFactoryQueueConnectionFactory factory=(QueueConnectionFactory)context.lookup("ConnectionFactory");//创建QueueConnectionQueueConnection queueConnection= factory.createQueueConnection();//创建QueueSessionQueueSession 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. 计算机科学与技术与cs,CSgo! | 遇见CS—带你走进传说中的计算机专业

    原标题:CSgo! | 遇见CS-带你走进传说中的计算机专业 遇见CS 带你走进传说中的计算机专业 首先恭喜各位小萌新进入华中科技大学计算机科学与技术学院,在这里大家将度过四年难忘的大学时光. 相信大 ...

  2. 【密码学】一万字带您走进密码学的世界(下)

    引文 密码学是研究编制密码和破译密码的技术科学.研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学:应用于破译密码以获取通信情报的,称为破译学,总称密码学. 在<一万字带您走进密 ...

  3. 【密码学】一万字带您走进密码学的世界(上)

    引文 密码学是研究编制密码和破译密码的技术科学.研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学:应用于破译密码以获取通信情报的,称为破译学,总称密码学. 为了使读者对密码学有一个整 ...

  4. 十三、写了两年多Python文章的我,带你走进Python数据分析

    @Author : By Runsen @Date : 2020/5/13 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘 ...

  5. 带你走进rsync的世界

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

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

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

  7. 送福利 | 送书5本《ASP.NET Core项目开发实战入门》带你走进ASP.NET Core开发

    <ASP.NET Core项目开发实战入门>从基础到实际项目开发部署带你走进ASP.NET Core开发. ASP.NET Core项目开发实战入门是基于ASP.NET Core 3.1 ...

  8. 孩子对不起,是我们带你们走进了地狱

    "三种颜色"事件不说了.这是普通人和另一群人之间的战争,这事不能就这么过去. 在这之前,我们先来谈谈<熔炉>这部伟大而沉重的电影.故事讲述了一家听障学校,校长.教导主任 ...

  9. 带你走进T-Pot多蜜罐平台革命:简述、安装、使用、优化、更新

    带你走进T-Pot:多蜜罐平台革命 T-Pot 19.03 T-Pot 19.03 runs on Debian (Sid), is based heavily on docker, docker-c ...

最新文章

  1. 分布式事务中间件Fescar—全局写排它锁解读
  2. 修改一个列表中的一个单词小技巧笔记
  3. Java PropertyPermission equals()方法与示例
  4. confirm关闭 layer_基于 vue+layer.js 超青睐的弹窗组件VueLayer
  5. 抽象类实现接口,子类继承抽象类,这三个之间的关系?
  6. 51单片机控制蜂鸣器播放《梧桐树》
  7. HTML体育新闻案例
  8. UE5 WebUI 5.0.1插件下载
  9. Hot Observable 和 Cold Observable的区别
  10. 小甲鱼Python3学习笔记之第十讲(仅记录学习)
  11. MyBatis中设置事务自动提交
  12. AliCDN,盛开在云端的花朵
  13. 深度强化学习系列: “奖励函数”的设计和设置(reward shaping)
  14. java 锁旗标_Java基础知识点整理(一)
  15. 中科创达发布融合智能泊车技术于解决方案
  16. 粗心店主下班忘关店门 执勤巡特警守候至凌晨
  17. 六月情报!六月情报!IAC的终结,反波胆的没落,龙抬头的套路
  18. 颈椎间盘突出的治疗方法
  19. python字典多重
  20. 使用vue做一个“淘宝“项目——3

热门文章

  1. 性能测试之JMeter取样器详解:sampler
  2. 百度联盟广告代码php,百度联盟原生广告的投放步骤
  3. spgwr | R语言与地理加权回归(Ⅰ-2):广义线性地理加权回归
  4. 圆柱与平面接触宽度_好烦!这个建筑高大斜圆柱真难施工!别怕!学会这种工法就不难了...
  5. 程序员“小白”打野升级指南,值得收藏
  6. 从大到小输出a、b、c(选择结构)
  7. 对计算机辅助英语的看法,论我国计算机辅助英语笔译的必要性
  8. android+委托列表,在Android适配器中使用委托者模式
  9. php mysql 排序规则_使用PHP的MySQL最好的排序规则是什么?
  10. python之路 mysql 博客园_python之路--MySQL数据库初识