博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
带你走进EJB--MDB
阅读量:5887 次
发布时间:2019-06-19

本文共 3091 字,大约阅读时间需要 10 分钟。

    

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

        MDB(Message DrivenBean)消息驱动Bean.它是EJBJMS的一个整合,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会被出发,以下是效果

计算机生成了可选文字:16:47:26,767INFO[sTDouT]MyQueueMDBBean被调用7[heiioworid!]

        

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

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

    

 

你可能感兴趣的文章
UVa 10057 - A mid-summer night's dream
查看>>
解决3 字节的 UTF-8 序列的字节 3 无效
查看>>
jQuery获取属性值
查看>>
浅谈浏览器兼容性问题-(1)产生、看待与思
查看>>
iOS8中定位服务的变化(CLLocationManager协议方法不响应,无法回掉GPS方法,不出现获取权限提示)...
查看>>
BeanUtils\DBUtils
查看>>
Recover the String
查看>>
VC 创建托盘,托盘tooltip。右键托盘菜单,点击别的地方会隐藏掉的问题。
查看>>
11 种在大多数教程中找不到的JavaScript技巧
查看>>
第一天,新的定义
查看>>
WPF EventSetter Handler Command
查看>>
polya定理,环形涂色
查看>>
day4-装饰器前奏
查看>>
【Jest】笔记三:全局变量
查看>>
forward和redirect的区别
查看>>
基本数据类型
查看>>
使用JavaMail完成邮件的编写
查看>>
洛谷P1576 最小花费
查看>>
封装了一个类,可生成验证码,缩略图,及水印图
查看>>
NewSQL为何使传统关系数据库黯然失色?
查看>>