在OC4J下配置JMS & 使用Message-Driven Bean

本文转载自:http://harper.ycool.com/post.1021639.html

 

本文涉及的背景知识如下 

1. JNDI (Java Naming and Directory Service )  

2.    JMS (Reference: Java Message Service O’Reilly, Jan 2001 First Ed.)  

3.    EJB (Reference: Mastering Enterprise JavaBean, O’Reilly & Associates, 2001 )  

本文只涉及EJB中的Message-Driven Bean  

4.    OC4J (Oracle Container For J2EE, Oracle公司的J2EE Application Server)

 

Part I Setting up OC4J JMS Service

 

下面是一个示例:

<?xml version="1.0" standalone='yes'?>
<!DOCTYPE jms-server PUBLIC "OC4J JMS server" "http://xmlns.oracle.com/ias/dtds/jms-server-9_04.dtd">

<jms-server port="9127">

   
    <queue name="Jera MessageService Queue" location="jms/JeraMSQueue">
        <description>Queue for Jera MessageService</description>
    </queue>

    <topic name="Demo Topic" location="jms/demoTopic">
        <description>A dummy topic</description>
    </topic>
    
    <log>
        <file path="../log/jms.log"/>
        <!-- Uncomment this if you want to use ODL logging capabilities
        <odl path="../log/jms/" max-file-size="1000" max-directory-size="10000"/>
        -->
    </log>

    <queue-connection-factory location="jms/JeraMSQueueConnectionFactory"/>
   
</jms-server>

 

其中queuetopic tag声明了可以使用的javax.jms.Queuejavax.jms.Topic,queue-connection-factorytopic-connection-factory则声明了可供使用的javax.jms.QueueConnectionFactoryjavax.jms.TopicConnectionFactory.主要需要配置的就是这几个tag. 其中location的属性最为重要,它指明了该对象的JNDI Name.

 

改动完毕后,重启OC4J,便可以用JNDI服务找到这些对象并使用它们.JMS Service配置完成。可以在AS中运行下述代码以验证服务是否成功启动。(如果在运行过程中没有出现Exception,一般可以确定配置成功)

 

           

 

             Context jndiContext = new InitialContext();

 

             QueueConnectionFactory qcf = (QueueConnectionFactory)

 

             jndiContext.lookup("jms/JeraMSQueueConnectionFactory");

 

             QueueConnection connect = qcf.createQueueConnection();

 

             Queue q = (Queue)jndiContext.lookup("jms/JeraMSQueue");

 

             QueueSession session =      connect.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);

 

             QueueSender sender = session.createSender(q);

 

             connect.start();

 

             sender.send(session.createTextMessage("This is a message"));

 

             connect.close();

 

Part II Configuring Message-Driven Bean

 

 

      <message-driven >

 

         <description><![CDATA[<!-- begin-user-doc --> You can insert your documentation for '<em><b>MessageServiceBean</b></em>'.]]></description>

 

         <ejb-name>MessageServiceBean</ejb-name>

 

         <ejb-class>org.harper.frm.core.ejb.msg.MessageServiceBean</ejb-class>

 

         <transaction-type>Container</transaction-type>

 

         <acknowledge-mode>Auto-acknowledge</acknowledge-mode>

 

         <message-driven-destination>

 

            <destination-type>javax.jms.Queue</destination-type>

 

         </message-driven-destination>

 

       </message-driven>

 

  

 

      <!-- Message Driven Beans -->

 

      <message-driven-deployment name="MessageServiceBean"

 

                  destination-location="jms/JeraMSQueue"

 

                  connection-factory-location="jms/JeraMSQueueConnectionFactory">

 

      </message-driven-deployment>

 

 

 

 

 

    protected void doGet(HttpServletRequest request,

            HttpServletResponse response) throws Exception {

        doService(request, response);

    }

    protected void doPost(HttpServletRequest request,

            HttpServletResponse response) throws Exception {

        doService(request, response);

    }

    protected void doService(HttpServletRequest request,

            HttpServletResponse response) throws Exception {

        Context jndiContext = new InitialContext();

        QueueConnectionFactory qcf = (QueueConnectionFactory)

        jndiContext.lookup("jms/JeraMSQueueConnectionFactory");

      QueueConnection connect = qcf.createQueueConnection();

      Queue q = (Queue)jndiContext.lookup("jms/JeraMSQueue");

        QueueSession session = connect.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);

        QueueSender sender = session.createSender(q);

        connect.start();

        sender.send(session.createTextMessage("This is a message"));

        connect.close();  } 


      Message-Driven Bean
onMessage函数如下 

    public void onMessage(javax.jms.Message message) {

        // begin-user-code

        System.out.println("Message Driven Bean got message " + message);

        // TODO:  do business logic here

      // end-user-code

}


      执行后输出结果如下:

“Message Driven Bean got message TextMessage[ID:Oc4jJMS.Message.jiangha.71dc3d:1082ce8377e:-8000.8]”

证明配置成功完成。

 这里的name属性与上面ejb-jar.xml中的ejb-name属性是对应的。 destination-locationconnection-factory-location分别指定了MDB读取Message使用的消息队列和创建连接使用的Factory.这里的location必须是在jms.xml中声明过的连接。

 

 至此配置完成,下面要做的是测试工作。

 

 Part III Test

 

 测试环境由两部分组成:负责发送消息的Servlet和后台处理消息的Message-Driven Bean.

 

 Servlet端代码如下

  这个deployment-descriptor中,需要修改的部分主要有<transaction-type>(可选项为ContainerBean)<destination-type>(可选项为QueueTopic),根据MDB具体选择。

 

  如果读者对EJB比较熟悉,可能会注意到:SessionBeanEntityBean不同的是,Message-Driven Beandeployment-descriptor中没有包含JNDI location的信息。这是由MDB与其他两种EJB不同的工作方式决定的。在被创建后,MDB会使用指定的ConnectionFactory创建与JMS Service的连接,随后在指定的消息队列中监听消息,并根据收到的消息决定自己的行为。应用程序只能通过这个消息队列与MDB交互,所以MDB并不需要一个JNDI location.

 

  2.  orion-ejb-jar.xml的配置

 

 这个文件是OC4J系列Server专用的deployment-descriptor文件。如果使用的ASJBOSS,则要配置jboss.xml,其他类似。

 

 下面是一个示例:

 --本段假设读者已经具有EJB的相关背景知识(包括deployment descriptor),因此不再对一些常识进行说明。

 

    1.  ejb-jar.xml的配置

    JMS Service的运行需要一台JMS Server的支持。目前主流J2EE AS的开发商都在自己的产品中集成了JMS Server的实现,只需要正确的配置,启用JMS服务就可以了。本文中使用的JMS ServerOC4J JMS

 

    OC4J JMS的配置文件是$ORACLE_HOME/config/jms.xml,在$ORACLE_HOME/config/server.xml中使用”<jms-config path="./jms.xml"/>” tag指明。

 

   Jms.xmlDTD文件是http://xmlns.oracle.com/ias/dtds/jms-server-9_04.dtd

你可能感兴趣的:(oracle,bean,xml,jms,ejb)