本文为原创,如需转载,请注明作者和出处,谢谢!
上一篇:
eclipse + JBoss 5 + EJB3开发指南(13):在Servlet中访问应用程序管制EntityManager对象
在前面的文章中给出的SessionBean的例子都是同步调用SessionBean方法的,也就是说,只有当方法中的代码都执行完,才能返回到客户端。但在某些情况下,由于SessionBean方法的执行时间比较长,这就需要异步地调用该方法,否则客户端就需要等待比较长的时间。要实现异步调用,就需要使用本要讲的消息驱动Bean。消息驱动Bean的基本原理是客户端向消息服务器发送一条消息后,消息服务器会将该消息保存在消息队列中。在这时消息服务器中的某个消费者(读取并处理消息的对象)会读取该消息,并进行处理。发送消息的客户端被称为消息生产者。
本文给出的消息驱动Bean的例子的基本功能是客户端向消息服务器发送一条消息(该消息实际上是一个实体Bean的对象实例),然后消息消费者读取这条消息后,将消息中的实体Bean持久化。实现消息驱动Bean的步骤如下:
一、实现实体Bean
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->packageentity;
importjava.io.Serializable;
importjava.util.Date;
importjavax.persistence.Column;
importjavax.persistence.Entity;
importjavax.persistence.GeneratedValue;
importjavax.persistence.GenerationType;
importjavax.persistence.Id;
importjavax.persistence.Table;
@Entity
@Table(name="t_date")
publicclassDateBeanimplementsSerializable
{
privateintid;
privateDatemyDate;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
publicintgetId()
{
returnid;
}
publicvoidsetId(intid)
{
this.id=id;
}
@Column(name="mydate")
publicDategetMyDate()
{
returnmyDate;
}
publicvoidsetMyDate(DatemyDate)
{
this.myDate=myDate;
}
}
二、编写消息驱动Bean
消息驱动Bean必须实现MessageListener接口,当该消息驱动Bean接收到一个消息后,EJB容器就会调用MessageListener接口的onMessage方法来理该消息。消息驱动Bean的代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->packageservice;
importjavax.ejb.ActivationConfigProperty;
importjavax.ejb.EJBException;
importjavax.ejb.MessageDriven;
importjavax.jms.Message;
importjavax.jms.MessageListener;
importjavax.jms.ObjectMessage;
importjavax.persistence.EntityManager;
importjavax.persistence.PersistenceContext;
importentity.DateBean;
@MessageDriven(activationConfig={
@ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",propertyValue="queue/MDBQueue")
})
publicclassDateMessageBeanimplementsMessageListener
{
@PersistenceContext(unitName="myentity1")
privateEntityManagerem;
@Override
publicvoidonMessage(Messagemessage)
{
try
{
if(messageinstanceofObjectMessage)
{
ObjectMessageobjmsg=(ObjectMessage)message;
DateBeandateBean=(DateBean)objmsg.getObject();
em.persist(dateBean);
System.out.println("成功持久化DateBean对象!");
}
else
{
System.out.println("消息类型错误!");
}
}
catch(Exceptione)
{
thrownewEJBException(e);
}
}
}
消息驱动Bean需要使用
@MessageDriven进行注释。要注意的是destination属性的值是queue/MDBQueue。JBoss不会自已建立一个Queue对象,因此,需要手工来配置Queue对象。读者可以<JBoss5.x安装目录>\server\default\deploy目录中建立一个xxx-service.xml文件,其中xxx可以任意取值,但必须跟“-service”后缀,例如,abc-service.xml。该文件可以放在deploy或其子目录(可以是多层子目录)中。该文件的内容如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><?xmlversion="1.0"encoding="UTF-8"?>
<server>
<mbeancode="org.jboss.mq.server.jmx.Queue"name="jboss.mq.destination:service=Queue,name=MDBQueue">
<dependsoptional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
</server>
要注意的是,<mbean>元素的name属性值中的name必须是MDBQueue,要与queue/MDBQueue中的/后面的部分一致。如果不进行上面的配置,在启动JBOSS时就会抛出如下的异常:
javax.naming.NameNotFoundException: MDBQueue not bound 也可以将<mbean>元素放在deploy目录中的其他以-service.xml结尾的文件中。
如果不设置destination属性的值,在启动JBoss是会抛出如下的异常:
org.jboss.deployers.spi.DeploymentException: Required config property RequiredConfigPropertyMetaData@174098f[name=destination descriptions=[DescriptionMetaData@4ca30b[language=zh]]] for messagingType 'javax.jms.MessageListener' not found in activation config [ActivationConfigProperty(destinationType=javax.jms.Queue), ActivationConfigProperty(connectionFactoryJndiName=MyQueueConnectionFactory), ActivationConfigProperty(destinationName=MyRequestQueue)] ra=jboss.jca:service=RARDeployment,name='jms-ra.rar'
... ...
三、编写调用消息驱动Bean的SessionBean
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->packageservice;
importjava.util.ArrayList;
importjava.util.Date;
importjava.util.List;
importjavax.annotation.Resource;
importjavax.ejb.Stateless;
importjavax.jms.Connection;
importjavax.jms.ConnectionFactory;
importjavax.jms.MessageProducer;
importjavax.jms.ObjectMessage;
importjavax.jms.Queue;
importjavax.jms.Session;
importjavax.persistence.EntityManager;
importentity.DateBean;
importentity.Greeting;
@Stateless
publicclassGreeterBeanimplementsGreeter
{
@Resource(mappedName="ConnectionFactory")
privateConnectionFactorycf;
@Resource(mappedName="queue/MDBQueue")
privateQueuequeue;
@Override
publicStringgreet(Stringmessage)
{
try
{
DateBeandb=newDateBean();
db.setMyDate(newDate());
Connectionconnection=cf.createConnection();
Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
MessageProducermessageProducer=session.createProducer(queue);
ObjectMessageobjectMessage=session.createObjectMessage();
objectMessage.setObject(db);
messageProducer.send(objectMessage);
connection.close();
System.out.println("成功发送消息!");
}
catch(Exceptione)
{
System.out.println("发送消息失败!");
}
return"方法成功返回";
}
}
在上面的代码中使用ObjectMessage对象来包装要向消息服务器发送的实体Bean的对象实例。
除了可以在SessionBean中访问消息驱动Bean外,还可以在不同的机器上通过jndi来查找并调用消息驱动Bean,代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->packagetest;
importjava.util.Date;
importjavax.ejb.EJB;
importjavax.jms.Destination;
importjavax.jms.MessageProducer;
importjavax.jms.ObjectMessage;
importjavax.jms.Queue;
importjavax.jms.QueueConnection;
importjavax.jms.QueueConnectionFactory;
importjavax.jms.QueueSession;
importjavax.jms.TextMessage;
importjavax.naming.InitialContext;
importentity.DateBean;
importservice.Greeter;
publicclassClient
{
publicstaticvoidmain(String[]args)throwsException
{
InitialContextctx=newInitialContext();
QueueConnectionconnection=null;
QueueSessionsession=null;
QueueConnectionFactoryfactory=(QueueConnectionFactory)ctx.lookup("ConnectionFactory");
connection=factory.createQueueConnection();
session=connection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
Destinationdestination=(Queue)ctx.lookup("queue/MDBQueue");
MessageProducermessageProducer=session.createProducer(destination);
ObjectMessageobjectMessage=session.createObjectMessage();
DateBeandb=newDateBean();
db.setMyDate(newDate());
objectMessage.setObject(db);
messageProducer.send(objectMessage);
connection.close();
System.out.println("成功发送消息!");
}
}
下一篇:
eclipse + JBoss 5 + EJB3开发指南(15):拦截器方法和拦截器类
国内最棒的Google Android技术社区(eoeandroid),欢迎访问!《银河系列原创教程》发布《Java Web开发速学宝典》出版,欢迎定购
分享到:
相关推荐
总的来说,"使用Eclipse+Jboss+MySql开发EJB"是一个综合性的任务,涉及了开发环境的搭建、企业级组件的设计与实现、数据库的连接和操作以及应用的部署与测试。掌握这一流程对于Java EE开发者来说是至关重要的,因为...
总的来说,"eclipse + JBoss 5 + EJB3开发指南中的代码"涵盖了Java EE开发的关键方面,特别是EJB3的使用。通过实践这些示例,开发者可以深入了解如何在现代企业环境中利用EJB3提高生产力,同时减少开发和维护的复杂...
### Eclipse + JBoss 5 + EJB3 开发指南 #### (1):编写第一个无状态的SessionBean ##### 一、配置开发环境 在开始编写无状态的SessionBean之前,首先需要确保开发环境已经正确配置。以下是所需的主要组件: 1...
在本文中,我们将深入探讨如何使用Eclipse IDE与JBoss应用程序服务器(版本7.x)来开发和部署一个基于EJB 3.x的简单企业级Java应用程序。EJB(Enterprise JavaBeans)是Java平台上的核心组件,它提供了一种标准的...
在实验中,你可能还会学习到EJB的接口定义、实体Bean(Entity Bean,用于持久化数据)、消息驱动Bean(Message-Driven Bean,用于处理消息队列)以及EJB的生命周期管理。此外,理解EJB容器如何处理事务、安全性、...
3. **消息驱动Bean (Message Driven Beans)**:用于处理消息队列中的消息,常用于异步处理。 **JPA(Java Persistence API)**是Java标准的ORM框架,允许开发者使用Java对象来操作数据库。JPA通过注解或XML配置将...
### yeclipse7.0+JBoss5.0测试EJB3.0环境搭建过程详解 在深入探讨如何在yeclipse7.0与JBoss5.0环境下构建和测试EJB3.0应用之前,让我们先了解一些背景知识。EJB(Enterprise JavaBeans)是Java平台的一部分,用于...
1. **EJB3基础**:介绍EJB3的主要概念,包括实体Bean、会话Bean和消息驱动Bean的基本用法。 2. **JBoss应用服务器设置**:讲解如何安装和配置JBoss,以便运行EJB3应用。 3. **Eclipse集成**:说明如何在Eclipse IDE...
EJB主要分为三种类型:会话bean(Session Beans)处理业务逻辑,实体bean(Entity Beans)代表持久化的业务对象,消息驱动bean(Message-Driven Beans)处理消息队列。EJB提供事务管理、安全性、并发控制等高级功能...
本文将围绕“Jboss下开发ejb应用之一会话bean的应用”这一主题,深入探讨如何在Jboss应用服务器上开发和部署会话Bean,以及涉及到的相关工具和源码。 会话Bean是EJB的一种类型,它代表了业务逻辑组件,为客户端提供...
在本课程测试代码中,我们将探讨如何在Eclipse集成开发环境(IDE)下使用Apache Ant构建工具,配合JBoss 5.1应用服务器进行EJB的开发和部署。 【Eclipse】是广泛使用的开源Java IDE,支持多种Java项目类型,包括EJB...
总的来说,MyEclipse结合JBoss提供了一个高效、便捷的EJB开发环境,使开发者能够轻松地利用EJB技术来构建企业级应用。无论是新手还是经验丰富的开发者,都可以从中受益,实现更高质量的Java EE项目开发。
根据文件信息,以下是关于Jboss7.1.1与eclipse-kepler集成并开发ejb3的知识点。 首先,环境搭建方面,需要准备 JDK 1.5 或更高版本,并安装 Eclipse Kepler(版本4.3)。接着,下载并解压 Jboss7.1.1 到指定文件夹...
在IT领域,尤其是对于Java开发者而言,掌握如何使用MyEclipse和JBoss开发企业级Java Bean(EJB)是至关重要的技能。MyEclipse作为一款功能丰富的集成开发环境(IDE),不仅支持Java开发,还提供了对EJB、Web服务、...
【标题】:“ejb2.0消息驱动bean的开发(JBOSS4.0.4.GA 环境)” 在Java企业版(Java EE)的早期版本中,EJB(Enterprise JavaBeans)2.0是核心组件之一,用于构建分布式、事务处理和面向服务的业务应用程序。消息...
EJB有三种类型:会话Bean、实体Bean和消息驱动Bean。本例中主要涉及的是会话Bean,具体为无状态会话Bean(Stateless Session Bean)。 #### 无状态会话Bean (Stateless Session Bean) 无状态会话Bean在处理客户端...
【标题】:“Jboss下开发ejb应用之一消息驱动bean的应用” 在Java企业级应用开发中,EJB(Enterprise JavaBeans)是核心组件之一,它提供了面向服务的、可复用的业务逻辑。EJB规范定义了三种类型的bean:会话bean、...