`
holdbelief
  • 浏览: 705947 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

EJB3.0 MDB的实现

 
阅读更多

EJB3.0 MDB的实现
2009年02月05日 星期四 11:29

首先消息驱动bean是一个消息的接收者,它要实现MessageListioner接口,并且实现里面onMessage方法,作为ejb3来说需要annotation来说明这个bean是mdb
@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/myDestination")})

第一个属性标识,这个mdb是个基于队列的
第二个属性标识,这个mdb的目标位置,也就是JNDI
然后就可以部署这个MDB了,下面是我的源程序
t javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.BytesMessage;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/myDestination")})
publicclass Messager implements MessageListener
{

    publicvoid onMessage(Message msg)
    {
        try
        {
            if (msg instanceof TextMessage)
            {
                TextMessage tmsg = (TextMessage) msg;
                String content = tmsg.getText();
                this.print(content);
            } elseif (msg instanceof ObjectMessage)
            {
                ObjectMessage omsg = (ObjectMessage) msg;
                Man man = (Man) omsg.getObject();
                String content = man.getName() + " 家住" + man.getAddress();
                this.print(content);
            } elseif (msg instanceof MapMessage)
            {
                MapMessage map = (MapMessage) msg;
                String content = map.getString("no1");
                this.print(content);
            } elseif (msg instanceof BytesMessage)
            {
                BytesMessage bmsg = (BytesMessage) msg;
                ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
                byte[] buffer = newbyte[256];
                int length = 0;
                while ((length = bmsg.readBytes(buffer)) != -1)
                {
                    byteStream.write(buffer, 0, length);
                }
                String content = new String(byteStream.toByteArray());
                byteStream.close();
                this.print(content);
            } elseif (msg instanceof StreamMessage)
            {
                StreamMessage smsg = (StreamMessage) msg;
                String content = smsg.readString();
                this.print(content);
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        }

    }

    privatevoid print(String content)
    {
        System.out.println(content);
    }

}
这是里面用到的一个pojo
import java.io.Serializable;

publicclass Man implements Serializable
{
    privatestaticfinallongserialVersionUID = -1789733418716736359L;

    private String name;//姓名

    private String address;//地址

    public Man(String name, String address)
    {
        this.name = name;
        this.address = address;
    }

    public String getName()
    {
        returnname;
    }

    publicvoid setName(String name)
    {
        this.name = name;
    }

    public String getAddress()
    {
        returnaddress;
    }

    publicvoid setAddress(String address)
    {
        this.address = address;
    }
}
打成jar包并且部署
控制台出错,大概的意思是说我在annotation中标识的destination的JNDI没有找到.
因此需要写一个配置文件来标识我的mdb的jndi
起名为mymdb-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=myDestination">
      <attribute name="JNDIName">queue/myDestination</attribute>
      <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
   </mbean>
</server>

然后再启动,控制台正常.

书写客户端调用程序
package test.jms;

import java.util.Properties;

import javax.jms.BytesMessage;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
import javax.naming.InitialContext;

import com.foshanshop.ejb3.jms.Man;

publicclass QueueSender
{

    publicstaticvoid main(String[] args)
    {
        QueueConnection conn = null;
        QueueSession session = null;
        try
        {
            Properties props = new Properties();
            props.setProperty("java.naming.factory.initial",
                    "org.jnp.interfaces.NamingContextFactory");
            props.setProperty("java.naming.provider.url", "localhost:1099");
            props.setProperty("java.naming.factory.url.pkgs",
                    "org.jboss.naming:org.jnp.interfaces");
            InitialContext ctx = new InitialContext(props);
            QueueConnectionFactory factory = (QueueConnectionFactory) ctx
                    .lookup("ConnectionFactory");
            conn = factory.createQueueConnection();
            session = conn.createQueueSession(false,
                    QueueSession.AUTO_ACKNOWLEDGE);
            Destination destination = (Queue) ctx.lookup("queue/myDestination");
            MessageProducer producer = session.createProducer(destination);
            //        发送文本
            TextMessage msg = session
                    .createTextMessage("这是我的第一个消息驱动Bean");
            producer.send(msg);
            //        发送Ojbect(对像必须实现序列化,否则等着出错吧)
            producer
                    .send(session.createObjectMessage(new Man("美女", "北京")));
            //        发送MapMessage
            MapMessage mapmsg = session.createMapMessage();
            mapmsg.setObject("no1", "北京");
            producer.send(mapmsg);
            //        发送BytesMessage
            BytesMessage bmsg = session.createBytesMessage();
            bmsg.writeBytes("我是一个兵,来自老百姓".getBytes());
            producer.send(bmsg);//发送StreamMessage
            StreamMessage smsg = session.createStreamMessage();
            smsg.writeString("我就爱流读写");
            producer.send(smsg);
        } catch (Exception e)
        {
            System.out.println(e.getMessage());
        } finally
        {
            try
            {
                session.close();
                conn.close();
            } catch (JMSException e)
            {
                e.printStackTrace();
            }
        }
    }
}


分享到:
评论

相关推荐

    mdb.rar_EJB3.0_ejb3.0 example

    标题"mdb.rar_EJB3.0_ejb3.0 example"暗示我们这里涉及的是EJB 3.0中Message Driven Bean(MDB)的示例。MDB是一种特殊类型的EJB,专门用于处理JMS(Java Message Service)消息,它是异步处理和解耦应用组件的理想...

    ejb3.0入门图文教程

    接下来,《EJB3.0开发Message Driven Bean.pdf》将引导你了解消息驱动bean(MDB)。MDB是一种特殊类型的session bean,专门用于处理JMS(Java Message Service)消息。在企业级应用中,当系统需要异步处理大量数据...

    EJB3.0源代码

    总的来说,"EJB3.0源代码"的压缩包很可能包含了使用EJB 3.0规范编写的各类Bean的源码,包括实体Bean、无状态会话Bean、有状态会话Bean和消息驱动Bean,以及相关的配置文件。通过分析这些源代码,我们可以深入理解EJB...

    EJB3.0 EJB3.0

    EJB 3.0的核心目标是实现POJO(Plain Old Java Object)编程模型,从而摆脱了早期版本EJB中的复杂性。 1. **EJB 3.0的三大组件** - **实体Bean(Entity Bean)**:代表持久化的业务对象,负责存储数据到数据库。...

    EJB3.0 ——黎活明

    黎活明老师的这本书《EJB3.0》是国内首部全面解析EJB 3.0技术的专业著作,旨在帮助读者深入理解这一核心技术。 ### 1. EJB 3.0的核心概念 - **实体Bean(Entity Beans)**:EJB 3.0中的实体Bean不再需要编写复杂的...

    EJB3.0入门图文教程

    **EJB3.0入门图文教程** EJB(Enterprise JavaBeans)是Java平台企业版(Java EE)的一部分,主要用于构建可扩展、可移植、安全且可靠的服务器端应用程序。EJB3.0是EJB规范的一个重大改革版本,它极大地简化了开发...

    EJB3.0__EJB3.0

    在EJB3.0中,这两种注解使接口的使用更加灵活,无需传统的接口实现方式。 总的来说,EJB3.0简化了传统EJB的复杂性,提升了开发效率,同时保持了企业级应用所需的关键特性。通过注解、容器管理和事务支持,EJB3.0...

    EJB3.0开发Message Driven Bean

    本文将详细介绍如何使用EJB3.0在JBoss IDE中创建和部署MDB。 #### 二、准备工作 1. **安装工具和软件**: - **JBoss IDE 1.5 GA**:提供了一整套针对JBoss应用程序服务器的集成开发环境(IDE),支持EJB3.0、JBPM、...

    EJB3.0详解

    EJB3.0是EJB规范的一个重大改进版本,吸取了其他框架如Hibernate和Spring的优点,极大地简化了开发过程,使其变得更加易用。 在EJB3.0中,主要定义了三种类型的Bean: 1. **会话Bean(Session Bean)**:会话Bean...

    JBOSS 4.0.5 EJB3.0之MDB (ACTIVEMQ)

    **JBoss 4.0.5 EJB3.0与MDB (ActiveMQ)** JBoss 4.0.5是Red Hat公司推出的企业级Java应用服务器版本,它支持EJB3.0规范,这是一种用于构建分布式企业级应用程序的组件模型。EJB(Enterprise JavaBeans)是Java EE...

    ejb3.0实例教程

    这个"ejb3.0实例教程"很可能是为了帮助开发者深入理解并熟练掌握EJB 3.0的核心概念和实践操作。 EJB 3.0引入的关键改进包括: 1. **注解驱动**:在EJB 2.x中,开发者需要编写大量的XML配置文件来描述组件的行为。...

    ejb3.0技术规范(中文版)

    ejb3.0的技术进步显著降低了企业级应用的开发复杂性,使Java EE开发者能够更专注于业务逻辑,而不是底层基础设施的实现。学习并掌握ejb3.0的相关知识点,对于提升Java EE项目开发的效率和质量具有重大意义。

    EJB 3.0实例教程

    在EJB 3.0中,MDB通过`@MessageDriven`注解进行声明。它监听特定的消息队列,当消息到达时,自动触发Bean的方法进行处理。这种方式非常适合处理那些不需要立即响应,但需要后台处理的任务,如批量数据处理或邮件发送...

    EJB3.0实例教程

    9. **消息驱动Bean(Message-Driven Beans,MDB)**:EJB3.0的MDB用于处理JMS(Java Message Service)消息,为应用提供解耦的事件驱动模型。 10. **安全性**:EJB3.0支持JAAS(Java Authentication and ...

    Jbuilder2007开发EJB3.0

    2. **Message Driven Bean(MDB)**:MDB是EJB3.0中处理消息的无状态组件,主要用于异步处理JMS(Java Message Service)消息。它允许应用程序在不阻塞其他任务的情况下处理后台任务,提高了系统的并发性和响应性。...

    EJB 3.0 in Action

    5. **消息驱动Bean (MDB)**:EJB 3.0提供了更强大的消息驱动Bean支持,用于实现异步消息处理。 6. **持久化API (JPA)**:作为EJB 3.0的一部分,Java Persistence API为对象关系映射提供了一种标准方式。 #### 三、...

    ejb 3.0 新实例

    另一个文件名“pear.ejb3.mdb”可能涉及EJB 3.0的消息驱动bean。这个示例可能会展示如何配置bean来监听JMS队列或主题,以及如何处理接收到的消息。 通过这些实例,开发者可以深入理解EJB 3.0如何简化企业级应用的...

    JBoss EJB3.0实例教程

    书中可能涵盖了诸如数据库连接池、消息驱动bean(Message Driven Bean, MDB)、定时器服务(Timer Service)、会话bean的生命周期管理等多个主题,帮助读者全面掌握EJB3.0的实用技能。 总之,《JBoss EJB3.0实例...

    EJB3.0程序设计

    6. **安全性**:EJB3.0集成了JAAS(Java Authentication and Authorization Service),通过`@RolesAllowed`注解实现角色基础的访问控制。 7. **查询语言(Query Language)**:JPQL(Java Persistence Query ...

Global site tag (gtag.js) - Google Analytics