`

Eclipse+JBoss+EJB3消息驱动Bean

    博客分类:
  • EJB3
阅读更多
SessionBean的例子都是同步调用SessionBean方法的,也就是说,只有当方法中的代码都执行完,才能返回到客户端。但在某些情况下,由于SessionBean方法的执行时间比较长,这就需要异步地调用该方法,否则客户端就需要等待比较长的时间。要实现异步调用,就需要使用本要讲的消息驱动Bean。消息驱动Bean的基本原理是客户端向消息服务器发送一条消息后,消息服务器会将该消息保存在消息队列中。在这时消息服务器中的某个消费者(读取并处理消息的对象)会读取该消息,并进行处理。发送消息的客户端被称为消息生产者。
本文给出的消息驱动Bean的例子的基本功能是客户端向消息服务器发送一条消息(该消息实际上是一个实体Bean的对象实例),然后消息消费者读取这条消息后,将消息中的实体Bean持久化。实现消息驱动Bean的步骤如下:
一、实现实体Bean
package entity; 

import java.io.Serializable; 
import java.util.Date; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity
@Table(name="t_date") 
public class DateBean implements Serializable 

    private int id; 
    private Date myDate; 
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    public int getId() 
    { 
        return id; 
    } 
     
    public void setId(int id) 
    { 
        this.id = id; 
    } 
    @Column(name="mydate") 
    public Date getMyDate() 
    { 
        return myDate; 
    } 
    public void setMyDate(Date myDate) 
    { 
        this.myDate = myDate; 
    } 
     

二、编写消息驱动Bean
消息驱动Bean必须实现MessageListener接口,当该消息驱动Bean接收到一个消息后,EJB容器就会调用MessageListener接口的onMessage方法来理该消息。消息驱动Bean的代码如下:
package service; 

import javax.ejb.ActivationConfigProperty; 
import javax.ejb.EJBException; 
import javax.ejb.MessageDriven; 
import javax.jms.Message; 
import javax.jms.MessageListener; 
import javax.jms.ObjectMessage; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import entity.DateBean; 

@MessageDriven( activationConfig =  {         
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/MDBQueue") 
      }) 
public class DateMessageBean implements MessageListener 

    @PersistenceContext(unitName = "myentity1") 
    private EntityManager em; 

    @Override
    public void onMessage(Message message) 
    { 
        try
        { 
            if(message instanceof ObjectMessage) 
            { 

                ObjectMessage objmsg = (ObjectMessage) message; 
                DateBean dateBean = (DateBean) objmsg.getObject(); 
                em.persist(dateBean); 
                System.out.println("成功持久化DateBean对象!"); 
            } 
            else
            { 
                System.out.println("消息类型错误!"); 
            } 
        } 
        catch (Exception e) 
        { 
            throw new EJBException(e); 
        } 

    } 


消息驱动Bean需要使用@MessageDriven进行注释。要注意的是destination属性的值是queue/MDBQueue。JBoss不会自已建立一个Queue对象,因此,需要手工来配置Queue对象。读者可以\server\default\deploy目录中建立一个xxx-service.xml文件,其中xxx可以任意取值,但必须跟“-service”后缀,例如,abc-service.xml。该文件可以放在deploy或其子目录(可以是多层子目录)中。该文件的内容如下:
< xml version="1.0" encoding="UTF-8"?>
< server>
  < mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=MDBQueue">
    < depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManagerdepends>
  < mbean>
< server>
    
要注意的是,元素的name属性值中的name必须是MDBQueue,要与queue/MDBQueue中的/后面的部分一致。如果不进行上面的配置,在启动JBOSS时就会抛出如下的异常:
javax.naming.NameNotFoundException: MDBQueue not bound
也可以将元素放在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
package service; 

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
import javax.annotation.Resource; 
import javax.ejb.Stateless; 
import javax.jms.Connection; 
import javax.jms.ConnectionFactory; 
import javax.jms.MessageProducer; 
import javax.jms.ObjectMessage; 
import javax.jms.Queue; 
import javax.jms.Session; 
import javax.persistence.EntityManager; 
import entity.DateBean; 
import entity.Greeting; 

@Stateless
public class GreeterBean implements Greeter 

    @Resource(mappedName = "ConnectionFactory") 
    private ConnectionFactory cf; 
    @Resource(mappedName = "queue/MDBQueue") 
    private Queue queue; 

    @Override
    public String greet(String message) 
    { 
        try
        { 
            DateBean db = new DateBean(); 
            db.setMyDate(new Date()); 
            Connection connection = cf.createConnection(); 
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
            MessageProducer messageProducer = session.createProducer(queue); 
            ObjectMessage objectMessage = session.createObjectMessage(); 
            objectMessage.setObject(db); 
            messageProducer.send(objectMessage); 
            connection.close(); 
            System.out.println("成功发送消息!"); 
        } 
        catch (Exception e) 
        { 
            System.out.println("发送消息失败!"); 
        } 

        return "方法成功返回"; 

    } 

在上面的代码中使用ObjectMessage对象来包装要向消息服务器发送的实体Bean的对象实例。
除了可以在SessionBean中访问消息驱动Bean外,还可以在不同的机器上通过jndi来查找并调用消息驱动Bean,代码如下:
package test; 

import java.util.Date; 
import javax.ejb.EJB; 
import javax.jms.Destination; 
import javax.jms.MessageProducer; 
import javax.jms.ObjectMessage; 
import javax.jms.Queue; 
import javax.jms.QueueConnection; 
import javax.jms.QueueConnectionFactory; 
import javax.jms.QueueSession; 
import javax.jms.TextMessage; 
import javax.naming.InitialContext; 
import entity.DateBean; 

import service.Greeter; 

public class Client 


    public static void main(String[] args) throws Exception 
    { 
        InitialContext ctx = new InitialContext(); 
        QueueConnection connection = null; 
        QueueSession session = null; 
        QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory"); 
        connection = factory.createQueueConnection(); 
        session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); 
        Destination destination = (Queue) ctx.lookup("queue/MDBQueue"); 
        MessageProducer messageProducer = session.createProducer(destination); 
        ObjectMessage objectMessage = session.createObjectMessage(); 
        DateBean db = new DateBean(); 
        db.setMyDate(new Date()); 
        objectMessage.setObject(db); 
        messageProducer.send(objectMessage); 
        connection.close(); 
        System.out.println("成功发送消息!"); 
    } 
分享到:
评论

相关推荐

    使用Eclipse+Jboss+MySql开发EJB

    3. **配置EJB**:在ejb-jar.xml或META-INF/beans.xml文件中配置EJB,包括声明bean的类型、接口、生命周期行为等。 4. **持久化管理**:如果EJB需要与数据库交互,需要配置JPA(Java Persistence API)或Hibernate来...

    使用eclipse通过jboss开发简单的ejb应用(jboss7.x & ejb3.x)

    在本文中,我们将深入探讨如何使用Eclipse IDE与JBoss应用程序服务器(版本7.x)来开发和部署一个基于EJB 3.x的简单企业级Java应用程序。EJB(Enterprise JavaBeans)是Java平台上的核心组件,它提供了一种标准的...

    eclipse + JBoss 5 + EJB3开发指南中的代码

    EJB3的核心概念包括实体Bean(Entity Beans)、会话Bean(Session Beans)和消息驱动Bean(Message-Driven Beans)。在本示例中,我们可能会看到`HelloWorldEJB3`这样的项目,它通常包含一个简单的EJB3 Bean,展示...

    Eclipse + JBoss 5 + EJB3开发指南.pdf

    ### Eclipse + JBoss 5 + EJB3 开发指南 #### 概述 《Eclipse + JBoss 5 + EJB3开发指南》是一本针对初学者和中级开发者设计的实用指南,它提供了如何在Eclipse环境下利用JBoss 5进行EJB3应用开发的详细步骤。本书...

    eclipse + JBoss 5 + EJB3开发指南

    ### Eclipse + JBoss 5 + EJB3 开发指南 #### (1):编写第一个无状态的SessionBean ##### 一、配置开发环境 在开始编写无状态的SessionBean之前,首先需要确保开发环境已经正确配置。以下是所需的主要组件: 1...

    Eclipse+Jboss EJB技术 会话Bean

    在实验中,你可能还会学习到EJB的接口定义、实体Bean(Entity Bean,用于持久化数据)、消息驱动Bean(Message-Driven Bean,用于处理消息队列)以及EJB的生命周期管理。此外,理解EJB容器如何处理事务、安全性、...

    EJB3 实例教程(JBoss+Eclipse+Ant)

    1. **EJB3基础**:介绍EJB3的主要概念,包括实体Bean、会话Bean和消息驱动Bean的基本用法。 2. **JBoss应用服务器设置**:讲解如何安装和配置JBoss,以便运行EJB3应用。 3. **Eclipse集成**:说明如何在Eclipse IDE...

    ejb课程测试代码,eclipse+jboss5.1 ant编译等代码

    在本课程测试代码中,我们将探讨如何在Eclipse集成开发环境(IDE)下使用Apache Ant构建工具,配合JBoss 5.1应用服务器进行EJB的开发和部署。 【Eclipse】是广泛使用的开源Java IDE,支持多种Java项目类型,包括EJB...

    EJB3+JBOSS5+JPA整合

    3. **消息驱动Bean (Message Driven Beans)**:用于处理消息队列中的消息,常用于异步处理。 **JPA(Java Persistence API)**是Java标准的ORM框架,允许开发者使用Java对象来操作数据库。JPA通过注解或XML配置将...

    MyEclipse+JBoss开发EJB.doc

    开发完成后,MyEclipse可以帮助我们将EJB部署到配置好的Jboss服务器上,通过服务器的管理控制台可以监控和管理这些EJB组件。这种方式使得开发者能够快速地进行迭代开发和测试,提高了开发效率。 总的来说,...

    myEclipse+Jboss+mysql+EJB

    EJB主要分为三种类型:会话bean(Session Beans)处理业务逻辑,实体bean(Entity Beans)代表持久化的业务对象,消息驱动bean(Message-Driven Beans)处理消息队列。EJB提供事务管理、安全性、并发控制等高级功能...

    ejb2.0消息驱动bean的开发(JBOSS4.0.4.GA 环境)

    【标题】:“ejb2.0消息驱动bean的开发(JBOSS4.0.4.GA 环境)” 在Java企业版(Java EE)的早期版本中,EJB(Enterprise JavaBeans)2.0是核心组件之一,用于构建分布式、事务处理和面向服务的业务应用程序。消息...

    Jboss下开发ejb应用之一会话bean的应用

    本文将围绕“Jboss下开发ejb应用之一会话bean的应用”这一主题,深入探讨如何在Jboss应用服务器上开发和部署会话Bean,以及涉及到的相关工具和源码。 会话Bean是EJB的一种类型,它代表了业务逻辑组件,为客户端提供...

    myeclpise+jboss开发EJB

    在IT领域,尤其是对于Java开发者而言,掌握如何使用MyEclipse和JBoss开发企业级Java Bean(EJB)是至关重要的技能。MyEclipse作为一款功能丰富的集成开发环境(IDE),不仅支持Java开发,还提供了对EJB、Web服务、...

    ejb+jboss+eclipse.txt

    EJB有三种类型:会话Bean、实体Bean和消息驱动Bean。本例中主要涉及的是会话Bean,具体为无状态会话Bean(Stateless Session Bean)。 #### 无状态会话Bean (Stateless Session Bean) 无状态会话Bean在处理客户端...

    Jboss下开发ejb应用之一消息驱动bean的应用

    【标题】:“Jboss下开发ejb应用之一消息驱动bean的应用” 在Java企业级应用开发中,EJB(Enterprise JavaBeans)是核心组件之一,它提供了面向服务的、可复用的业务逻辑。EJB规范定义了三种类型的bean:会话bean、...

    MyEclipse+EJB3+JBoss4部署EBJ+web项目HelloWorld详解

    ### MyEclipse+EJB3+JBoss4部署EJB+Web项目HelloWorld详解 #### 一、环境搭建 ##### 1. 安装 JDK 1.6 在开始之前,请确保您的开发环境中已经安装了 Java 开发工具包 (JDK) 1.6 版本。如果尚未安装,请访问 Oracle ...

    Jboss7.1.1+eclipse-kepler开发ejb3

    根据文件信息,以下是关于Jboss7.1.1与eclipse-kepler集成并开发ejb3的知识点。 首先,环境搭建方面,需要准备 JDK 1.5 或更高版本,并安装 Eclipse Kepler(版本4.3)。接着,下载并解压 Jboss7.1.1 到指定文件夹...

Global site tag (gtag.js) - Google Analytics