1. 功能介绍
在EJB的分类中还有一个就是消息驱动Bean(MessageDrivenBean),百度的说明其实很到位。
消息驱动Bean(MDB) 是设计用来专门处理基于消息请求的组件。一个MDB类必须实现MessageListener接口。当容器检测到bean守候的队列一条消息时,就调用onMessage()方法,将消息作为参数传入。MDB在OnMessage()中决定如何处理该消息。你可以用注释来配置MDB监听哪一条队列。当MDB 部署时,容器将会用到其中的注释信息。当一个业务执行的时间很长,而执行结果无需实时向用户反馈时,很适合使用消息驱动Bean。如订单成功后给用户发送一封电子邮件或发送一条短信等。消息驱动bean是一个异步消息使用者。当JMS消息到达时,容器激发消息驱动bean。消息驱动bean既没有本地接口也没有组件接口。消息驱动bean实例是一个消息驱动bean类的实例。对客户机来说,消息驱动bean是一个在服务器上实现某些业务逻辑的JMS消息使用者。客户机通过JMS发送消息到JMS Destination (Queue或Topic)来访问消息驱动bean,而消息驱动bean类是JMS Destination的MessageListener。
消息驱动bean实例没有会话状态。这意味着当不涉及服务客户机消息时,所有的bean实例都是等同的。消息驱动bean是匿名的。它们没有客户机可视的标识。容器创建消息驱动bean实例来进行消息处理,而消息驱动bean是这些消息的使用者。其生命周期由容器控制。
消息驱动bean实例没有特定于客户机的状态。然而,通过处理客户机信息,消息驱动bean实例的实例变量可以包含状态。这些状态的示例包括一个开放的数据库连接和一个EJB对象的对象引用。
|
其实核心的问题就是我们什么情况下使用消息驱动Bean
1):当一个业务方法需要很长时间处理的时候,而且处理时间十分不确定
2):客户端调用后无需服务端立刻返回结果
而我们在这里不得不再说一下,消息驱动Bean实际上就是一个异步的JMS消费者。而这个消费者一般需要做以下2件事情就够了。
1):通过实现onMessage()方法来获取消息目的的消息对象
2):调用业务逻辑EJB组件,对获取的信息执行业务逻辑
在EJB容器中,和SessionBean一样都是有一个对象池来维护消息驱动Bean的生命周期的。
2. 实例代码
首先我们在JBoss的控制台上配置一个新的Queue类型的JMS消息目的,如下所示:
如上所示,在JBoss中新增了一个叫做InsertUserQueue的消息目的。下面我们在服务器端开发消息驱动Bean以及和消息驱动Bean有关的类。
UserDTO类代表了表person的实体
package ejb.messageDrivenBean.dto;
import java.io.Serializable;
/**
* 表person的数据模型
* @author liuyan
*
*/
public class UserDTO implements Serializable {
/**
*
*/
private static final long serialVersionUID = -4153158445872587565L;
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
|
真正的消息驱动Bean
package ejb.messageDrivenBean;
/**
* 消息驱动Bean
*
* @author liuyan
*/
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "InsertUserQueue") })
public class UserDTOMessageDrivenBean implements MessageListener {
/**
* 注入其他EJB组件
*/
@EJB(beanName = "UserServiceEAOImpl")
private UserService userService;
/**
* 消息接到后的处理方法
*/
@Override
public void onMessage(Message message) {
// TODO Auto-generated method stub
if (message != null) {
if (message instanceof ObjectMessage) {
// 获得消息
ObjectMessage objectMessage = (ObjectMessage) message;
try {
// 强制转型
UserDTO userDTO = (UserDTO) objectMessage.getObject();
// 插入数据
userService.insertUser(userDTO);
System.out.println("执行插入业务完毕");
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
|
这个类是真正的消息驱动Bean,这里需要说明的就是此类必须实现接口MessageListener以及它的onMessage方法,在方法中会获得消息目的的消息,从而进行消息的消费。此处是调用了一个被注入的EJB组件——SessionBean。
还有一个需要重点说明的就是@MessageDriven注解,@MessageDriven注解有activationConfig属性配置,它是对该驱动Bean监听的JMS消息的一些配置信息,使用@ActivationConfigProperty注解作为配置项,每个配置项都是由propertyName和propertyValue这种键值对儿作为属性的配置。
1):destinationType:表示消费目的类型,是PTP类型或者定制
2):acknowledgeMode:JMS消息的确认模式,是否回复,还是自动回复
3):destination:表示监听的消息目的JNDI名,此属性只对JBoss容器生效
- 大小: 70.2 KB
分享到:
相关推荐
### Java EE 5 学习笔记06:EJB之消息驱动Bean总结 #### EJB 消息驱动 Bean (Message Driven Bean, MDB) 在Java EE 5中,消息驱动Bean(MDB)是一种特殊的EJB组件,它主要用于处理异步消息。MDB能够接收并处理由...
### JavaEE5学习笔记07-Web层与EJB集成总结 #### 一、JavaEE5框架中的Web层与EJB集成概述 在JavaEE5(即Java Platform, Enterprise Edition 5)中,Web层与EJB(Enterprise JavaBeans)的集成是构建企业级应用的...
### JavaEE5学习笔记01-JTA和数据库事务:深入解析与应用 #### 一、JavaEE5概览与核心组件 JavaEE5是Java Enterprise Edition的第五个版本,标志着企业级Java应用的一个重要里程碑。它引入了一系列重要的新特性,...
总结来说,JNDI和RMI在JavaEE5中提供了强大的服务发现和分布式对象通信能力,使得开发者能够构建可扩展、模块化的企业级应用。通过JNDI,应用可以轻松地查找和利用服务器上的资源,而RMI则为远程对象的调用提供了...
这篇学习笔记主要聚焦于JavaMail在JavaEE5中的使用,通过深入理解其核心概念和实践操作,我们可以更好地在实际项目中应用这一工具。 JavaMail API提供了一套标准的接口,允许Java应用程序发送和接收电子邮件。它...
javaee-api-8.0-javadoc.jar,这是javaee1.8api的jar包,解压后可用javadoc2chm制作成chm帮助文档。
JavaEE源代码 struts2-core-2.0.11JavaEE源代码 struts2-core-2.0.11JavaEE源代码 struts2-core-2.0.11JavaEE源代码 struts2-core-2.0.11JavaEE源代码 struts2-core-2.0.11JavaEE源代码 struts2-core-2.0.11JavaEE源...
JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-...
java javaee-api-6.0-5
JavaEE源代码 jaxen-1.1-beta-7JavaEE源代码 jaxen-1.1-beta-7JavaEE源代码 jaxen-1.1-beta-7JavaEE源代码 jaxen-1.1-beta-7JavaEE源代码 jaxen-1.1-beta-7JavaEE源代码 jaxen-1.1-beta-7JavaEE源代码 jaxen-1.1-...
EJB 3.0是Java EE 5中的核心组件之一,它极大地简化了EJB的使用,减少了对XML配置的依赖。实体Bean(Entity Beans)采用了注解驱动,无需XML配置,大大降低了学习和使用的难度。会话Bean(Session Beans)也变得更加...
JavaEE源代码 commons-logging-1.0.4JavaEE源代码 commons-logging-1.0.4JavaEE源代码 commons-logging-1.0.4JavaEE源代码 commons-logging-1.0.4JavaEE源代码 commons-logging-1.0.4JavaEE源代码 commons-logging-...
JavaEE源代码 commons-collections-2.1.1JavaEE源代码 commons-collections-2.1.1JavaEE源代码 commons-collections-2.1.1JavaEE源代码 commons-collections-2.1.1JavaEE源代码 commons-collections-2.1.1JavaEE源...
javaEE健康管理系统SSH-oracle(源码+数据库sql+lun文+视频齐全)javaEE健康管理系统SSH-oracle(源码+数据库sql+lun文+视频齐全)javaEE健康管理系统SSH-oracle(源码+数据库sql+lun文+视频齐全)javaEE健康管理系统SSH-...
JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源...