9. 编写消息驱动bean
消息驱动bean的主要用于接受和处理异步消息,这些信息可能来自一个外部的系统或者同一个应用中的其它组件,之所以称它们为异步,那时因为这些消息可以在任何时候到达,而不同于一般的远程方法调用的结果,是立马直接得到的。同UI的事件处理工作方式类似,消息驱动bean用于监听发送给它的异步消息。值得注意的是,与远程调用方法不同,异步消息的发送者不会停下来去等待对方的响应。消息驱动bean是J2EE中的一个标准服务(工具),全称是Java Message Service API,简称为JMS。它为所有需要消息系统服务的应用提供了一个接口。消息系统能够异步的发送和接受消息,这些消息可以是文本、对象或者其它的一些类型。这与远程过程调用(RPC)模型是相反的,在远程过程调用中,组件之间的交互都是同步发生的。任何一个符合JMS API规范的消息系统的实现都可以称做是一个JMS提供者(JMS Provider)。在J2EE SDK中自带有这个的一个JMS Provider,各个供应商也有自己的商业实现用于在企业级应用中使用消费服务。消息系统通过提供一个目的地(destination)存放消息直至这些消息被发送至接收方(recipient)来实现异步通信。其中消息目的地主要分为两类:
Ø 队列(Queue):用于保存从一个JMS客户端发往另一个JMS客户端的消息,这种消息模型被称为点对点(point-to-point);
Ø 主题(Topic):用于保存从许多潜在的JMS客户端发往多个潜在的JMS客户端的消息,这种消息模型被称为发布/订阅(publish/subscribe)模式;
其中一个MDB类必须实现MessageListener 接口。当容器检测到bean守候的队列一条消息时,就调用onMessage()方法,将消息作为参数传入。MDB在OnMessage()中决定如何处理该消息。你可以用注释来配置MDB 监听哪一条队列。当MDB 部署时,容器将会用到其中的注释信息。当一个业务执行的时间很长,而执行结果无需实时向用户反馈时,很适合使用消息驱动Bean。
本实验中采用队列的方式来实现消息驱动Bean,可通过Eclipse的创建向导来创建MDB。在Class name中填入消息驱动Bean的名称,选中下方的JMS选项同时在下方的Destination type中选择"Queue",点击下一步,在Transaction type中选择"Container",其余选项均保持默认即可。生成的MDB默认实现了MessageListener接口,只需实现其中的onMessage方法,从队列中获取消息并将消息内容显示到控制台中。
具体代码如下:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(
propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(
propertyName = "destination",
propertyValue = "queue/ConsumerQueue") })
public class Consumer implements MessageListener {
public void onMessage(Message message) {
System.out.println("^^^^^^^^^^^^ Get a message^^^^^^^^^^^^^^");
TextMessage tm = (TextMessage) message;
try {
System.out.println("@Message:" +tm.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
public static Context getInitialContext()
throws javax.naming.NamingException {
return new InitialContext();
}
}
|
上面通过@MessageDriven注释指明这是一个消息驱动Bean,并使用@ActivationConfigProperty注释配置消息的各种属性,其中destinationType属性指定消息的类型,消息有两种类型topics和queues,分别对应于上文描述的主题和队列。destination属性用作指定消息路径,消息驱动Bean在发布时,如果路径不存在,容器会自动创建该路径,当容器关闭时该路径会自动被删除。实验中,当一个消息到达queue/ConsumerQueue队列时,就会触发onMessage方法,消息作为一个参数传入,在onMessage方法里面得到消息体并调用println方法把消息内容打印到控制台上。以上便定义好了消息的接受者,另外还需要定义消息的发布者类,用于向队列中发送消息。代码如下:
public class Producer {
public static void sendMessage(String msg) throws Exception {
Context jndiContext = getInitialContext();
//根据上下文来查找一个连接工厂QueueConnectionFactory
ConnectionFactory factory = (ConnectionFactory) jndiContext
.lookup("ConnectionFactory");
//查找目的地(Topic/ Queue);
Queue queue = (Queue)
jndiContext.lookup("queue/ConsumerQueue");
//从连接工厂得到一个连接
Connection connect = factory.createConnection();
/*
* 通过连接来建立一个会话(Session)
* 建立不需要事务的并且能自动接收消息收条的会话,
* 在非事务Session 中,消息传递的方式有三种:
* 1)Session.AUTO_ACKNOWLEDGE :当客户机调用的receive
* 方法成功返回,或当MessageListenser 成功处理了消息,
* session将会自动接收消息的收条。
* 2)Session.CLIENT_ACKNOWLEDGE :客户机通过调用消息的
* acknowledge方法来接收消息。接收发生在session层。
* 接收到一个被消费的消息时,将自动接收该session已
* 经消费的所有消息。例如:如果消息的消费者消费了10
* 条消息,然后接收15 个被传递的消息,则前面的10 个消
* 息的收据都会在这15 个消息中被接收。
* 3)Session.DUPS_ACKNOWLEDGE :指示session缓慢接收消息。
*/
Session session = connect
.createSession(false, Session.AUTO_ACKNOWLEDGE);
//根据会话以及目的地来建立消息制造者
MessageProducer sender = session.createProducer(queue);
TextMessage message = session.createTextMessage();
message.setJMSReplyTo(queue);
message.setText(msg);
System.out.println("Sending message #:"+msg);
sender.send(message);
connect.close();
}
public static Context getInitialContext()
throws javax.naming.NamingException {
return new InitialContext();
}
}
|
如上文所说如果消息路径不存在,容器会自动创建该路径,当容器关闭时该路径会自动被删除。如果容器没有自动创建该路径也可以通过手动编写配置文件进行配置,配置文件如下:
mymdb-service.xml
. 编写Web客户端程序
客户端采用Jsp+Servlet实现,严格按照MVC模式进行分层,jsp负责前台界面的显示,在代码编写中使用了JSTL标签库和EL表达式;Servlet负责jsp页面中提交请求的处理,其通过调用EJB项目中的SessionBean来完成具体的业务功能。
. 部署
分别将EJB项目和web项目部署到jboss服务器中,查找修改部署中的错误,运行程序。
<!--EndFragment-->
分享到:
相关推荐
《EJB3.0入门经典》是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。《EJB3.0入门经典》内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发...
JSF1.2+EJB3.0实现的一个项目实例.zip
罗时飞精通EJB3.0.zip.001 罗时飞精通EJB3.0.zip.002 罗时飞精通EJB3.0.zip.003 《精通EJB3.0》共分为4个部分:第一部分对EJB编程基础进行介绍,概要性地对EJB进行了阐述;第二部分重点关注EJB编程的具体内容和...
罗时飞精通EJB3.0.zip.001 罗时飞精通EJB3.0.zip.002 罗时飞精通EJB3.0.zip.003 《精通EJB3.0》共分为4个部分:第一部分对EJB编程基础进行介绍,概要性地对EJB进行了阐述;第二部分重点关注EJB编程的具体内容和...
ejb3.0入门图文教程,包括EJB3.0开发Entity.pdf、EJB3.0开发Message Driven Bean.pdf、EJB3.0开发Session Bean.pdf
期待已久的 EJB3.0 最终规范已经发布了。虽然 EJB3.0 最终规范出来了一段时间,但对 EJB3.0 的应用还停留在介 绍之中,应用实例更是少之又少,所以作者拟写本书,以简单的实例展现 EJB3.0 的开发过程,希望对大家有所...
EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.
ejb3.0开发规范,开发ejb3.0过程中的参考文档
weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0
ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全
EJB 3.0实例教程.pdf EJB 3.0实例教程.pdf
本书面向EJB 3.0的实际应用开发,通过大量的实例,循序渐进地为读者介绍了有关EJB 3.0开发所涉及的各类知识。全书共分16章,内容依次包含了Java EE概述、EJB基础、搭建EJB环境、会话bean、持久化实体、持久化实体...
本书是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。 本书内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发技术的同时,精心设计了与...
EJB3.0规范和EJB3.0经典入门(含源码) 本材料适合Java程序员、项目经理和系统架构师。学习本材料,您不需要EJB2.x知识,如果具备一些Web和jdbc知识,学习效率会更快些。学习本材料,初级Java程序员应在1个月左右,...
jsf1.2+ejb3.0实现的员工管理系统 <br>1.项目说明: 本实例是一个用JSF1.2+EJB3.0实现的员工CRUD的一个实例,业务非常简单,主要是为了演示这两种技术的使用。若与商业应用类同,纯属巧合。 <br>2.源码...
本书是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。 本书内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发技术的同时,精心设计了与...
在Myeclipse,基于JBOSS EJB3.0实现了EJB3.0的初次体验,确实比EJB2.0方便了许多。文中有完整的过程和代码。
ejb3.0开发实例,会话bean开发,完整代码,适合入门学者
精通EJB3.0 pdf
EJB3.0规范 EJB3.0 SPECIFICATION 官方规范英文版