EJB3.0 MDB的实现

3 篇文章 0 订阅
2 篇文章 0 订阅

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();
            }
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jsf1.2+ejb3.0实现的员工管理系统1.项目说明:  本实例是一个用JSF1.2+EJB3.0实现的员工CRUD的一个实例,业务非常简单,主要是为了演示这两种技术的使用。若与商业应用类同,纯属巧合。2.源码说明: 1)本项目开发环境 操作系统: Windows xp sp2 JDK环境: JDK1.6.0 IDE工具: MyEclipse6.0GA 数据库: Mysql 5.0.41 字符集设置:utf-8 EJB容器: JBoss4.2.1GA Web容器: Tomcat 6.0.14 测试通过的浏览器: IE6.0 2)查看源码 使用MyEclipse的Import功能,就可打开。但必须得把MyEclipse的编译器调到支持JDK5.0特性,否则源代码可能编译不通过。 3)项目的目录 a. ejb端 jsfejb3-ejb |-- src |-- org.qiujy.ejb3.dao      持久层DAO接口包 |-- org.qiujy.ejb3.dao.impl 持久层DAO接口实现类包(是ejb3中的会话Bean) |-- org.qiujy.ejb3.entity 实体域模型类包 |-- META-INF |--persistence.xml EJB3的持久化配置文件 |--DBScript |--employee.sql 数据库脚本及测试数据 |--mysql-connector-java-5.1.5-bin.jar MySql的驱动程序包 |--mysql-ds.xml 在JBoss中配置MySql数据源的配置文件 b.web端 jsfejb3-war |-- src |-- org.qiujy.ejb3.dao      持久层DAO接口包 |-- org.qiujy.ejb3.entity 实体域模型类包 |-- org.qiujy.service 业务逻辑类包 |-- org.qiujy.vo 业务层数据类包(VO) |-- org.qiujy.web.controller JSF的托管Bean包 |--WebRoot |-- META-INF 打包的信息文件夹 |-- WEB-INF |-- faces-config.xml JSF的配置文件1,托管Bean的配置 |-- navigation.xml JSF的配置文件2,导航规则的配置 |-- web.xml web应用部署描述文件 |-- jsp页面 页面文件☆3.安装运行说明: 1).应用服务器 采用JBoss4.2.1GA,在发布ejb端程序时,要把MySql的驱动程序包和数据库配置文件(mysql-ds
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值