DriverMessageBean配置详解

0

环境介绍:JBoss 4 + EJB 2.1.

第一,配置Destination.

  在${jboss安装目录}/server/default/deploy/jms下,新建一个service文件,如my-service.xml。在其中配置destination. JBoss该目录下已有jbossmq-destinations-service.xml,可以参照此进行配置 。如:

配置Queue示例:

<mbean code="org.jboss.mq.server.jmx.Queue"
  name="jboss.mq.destination:service=Queue,name=testQueue">
    <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
    <depends optional-attribute-name="SecurityManager">jboss.mq:service=SecurityManager</depends>
    <attribute name="MessageCounterHistoryDayLimit">-1</attribute>
    <attribute name="SecurityConf">
      <security>
        <role name="guest" read="true" write="true"/>
        <role name="publisher" read="true" write="true" create="false"/>
        <role name="noacc" read="false" write="false" create="false"/>
      </security>
    </attribute>
  </mbean>

配置Topic示例:

  <mbean code="org.jboss.mq.server.jmx.Topic"
  name="jboss.mq.destination:service=Topic,name=testTopic">
    <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
    <depends optional-attribute-name="SecurityManager">jboss.mq:service=SecurityManager</depends>
    <attribute name="SecurityConf">
      <security>
        <role name="guest" read="true" write="true"/>
        <role name="publisher" read="true" write="true" create="false"/>
        <role name="durpublisher" read="true" write="true" create="true"/>
      </security>
    </attribute>
  </mbean>

第二步:开发MDB.

如:

public class MyTestMdb
     implements javax.ejb.MessageDrivenBean,
              javax.jms.MessageListener
{


public void ejbCreate() {
 // TODO Auto-generated method stub
 super.ejbCreate();
}

public MessageDrivenContext getMessageDrivenContext() {
 // TODO Auto-generated method stub
 return super.getMessageDrivenContext();
}

public void onMessage(Message arg0) {
 // TODO Auto-generated method stub
 //Process messages here

}
   public void setMessageDrivenContext(javax.ejb.MessageDrivenContext ctx)
   {
      super.setMessageDrivenContext(ctx);
   }

   public void ejbRemove()
   {
      super.ejbRemove();
   }

}

第三步:配置ejb-jar.xml。可以用xdoclet自动生成。ejb-jar.xml放到ejb源码/META-INF下。

主体大致如下:

      <message-driven id="MessageDriven_1">
         <description><![CDATA[<!-- begin-xdoclet-definition -->]]></description>

         <ejb-name>MyTestMdb</ejb-name>

         <ejb-class>org.beyondsoul.mdb.MyTestMdb</ejb-class>

         <messaging-type>javax.jms.MessageListener</messaging-type>
         <transaction-type>Container</transaction-type>
         <message-destination-type>javax.jms.Queue</message-destination-type>
         <activation-config>
           <activation-config-property>
             <activation-config-property-name>destinationType</activation-config-property-name>
             <activation-config-property-value>javax.jms.Queue</activation-config-property-value>
           </activation-config-property>
           <activation-config-property>
             <activation-config-property-name>acknowledgeMode</activation-config-property-name>
             <activation-config-property-value>Auto-acknowledge</activation-config-property-value>
           </activation-config-property>
         </activation-config>

      </message-driven>

第四步:配置供应商专有配置文件jboss.xml。jboss.xml放到ejb源码/META-INF下。在上一步的标准配置里,是没有涉及Destination的配置的,这个配置在这一步完成。

  <message-driven>
   <ejb-name>MyTestMdb</ejb-name>
   <destination-jndi-name>queue/testQueue</destination-jndi-name>
  </message-driven>

至此,配置完成。需要多注意上述粗体部分。   这一句<destination-jndi-name>queue/testQueue</destination-jndi-name>,前一部分粗体是queue。当Destination是Queue类型时,就用“queue”,是Topic时,用“topic”;后一部分粗体是上述配置的Destination名称。

需要说明的是,此处并没有配置Connection Factory,比如象BEA Weblogic的配置那样。JBoss 里 Connection Factory 的名称已经内置为“ConnectionFactory”了;

**************************
方法二


由于Connection Factory以及Destination都是EJB容器供应商专门提供,这些信息不在ejb-jar.xml里配置,所以在移植上带来很多方便。当然,有时也可考虑用resource-ref 在ejb-jar.xml里进行处理。如下所示:

先在jboss.xml里如是配置:

<?xml version="1.0"?>
<jboss>
<enterprise-beans>
<message-driven>
<ejb-name>TextMDB</ejb-name>
<destination-jndi-name>queue/testQueue</destination-jndi-name>
<resource-ref>
   <res-ref-name>jms/QCF</res-ref-name>
       <jndi-name>ConnectionFactory</jndi-name>
   </resource-ref>
</message-driven>
</enterprise-beans>
</jboss>

与此同时,保持同步,在ejb-jar.xml里如是配置:

<message-driven id="MessageDriven_1">
         <description><![CDATA[<!-- begin-xdoclet-definition -->]]></description>

         <ejb-name>MyTestMdb</ejb-name>

         <ejb-class>org.beyondsoul.mdb.MyTestMdb</ejb-class>

         <messaging-type>javax.jms.MessageListener</messaging-type>
         <transaction-type>Container</transaction-type>
         <message-destination-type>javax.jms.Queue</message-destination-type>
         <activation-config>
           <activation-config-property>
             <activation-config-property-name>destinationType</activation-config-property-name>
             <activation-config-property-value>javax.jms.Queue</activation-config-property-value>
           </activation-config-property>
           <activation-config-property>
             <activation-config-property-name>acknowledgeMode</activation-config-property-name>
             <activation-config-property-value>Auto-acknowledge</activation-config-property-value>
           </activation-config-property>
         </activation-config>
        
         <resource-ref>
            <res-ref-name>jms/QCF</res-ref-name>
            <res-type>javax.jms.QueueConnectionFactory</res-type>
            <res-auth>Container</res-auth>
         </resource-ref>

      </message-driven>

最后再补充说一下,消息发送端的代码示例:

 //Get InitialContext
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY,
                "org.jnp.interfaces.NamingContextFactory");
        env.put(Context.PROVIDER_URL, "jnp://localhost:1099/");
        env.put(Context.URL_PKG_PREFIXES,
                        "org.jboss.naming:org.jnp.interfaces");
        InitialContext iniCtx = new InitialContext(env);

 //Get a connection, find the destination, then send messages
        QueueConnectionFactory qcf = (QueueConnectionFactory) iniCtx.lookup("ConnectionFactory");;
        conn = qcf.createQueueConnection();
        que = (Queue) iniCtx.lookup("queue/testQueue");
        session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
        conn.start();

        QueueSender send = session.createSender(que);
        for (int i = 0; i < 10; i++) {
            TextMessage tm = session.createTextMessage(text + i);
            send.send(tm);
        }
 //post process
        send.close();
        conn.stop();
        session.close();
        conn.close();     

如:my-service.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- $Id: jbossmq-destinations-service.xml,v 1.4.6.1 2004/11/16 04:32:39 ejort Exp $ -->

<!--
   | This file defines the default Queues and Topics that JBossMQ
   | ships with.  The default Queues and Topics are used by the
   | JBoss test suite and by the sample jms programs.
   |
   | You can add other destinations to this file, or you can create other
   | *-service.xml files to contain your application's destinations.
 -->

<server>
<mbean code="org.jboss.mq.server.jmx.Queue"
  name="jboss.mq.destination:service=Queue,name=testQueue">
    <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
    <depends optional-attribute-name="SecurityManager">jboss.mq:service=SecurityManager</depends>
    <attribute name="MessageCounterHistoryDayLimit">-1</attribute>
    <attribute name="SecurityConf">
      <security>
        <role name="guest" read="true" write="true"/>
        <role name="publisher" read="true" write="true" create="false"/>
        <role name="noacc" read="false" write="false" create="false"/>
      </security>
    </attribute>
  </mbean>

<mbean code="org.jboss.mq.server.jmx.Topic"
  name="jboss.mq.destination:service=Topic,name=testTopic">
    <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
    <depends optional-attribute-name="SecurityManager">jboss.mq:service=SecurityManager</depends>
    <attribute name="SecurityConf">
      <security>
        <role name="guest" read="true" write="true"/>
        <role name="publisher" read="true" write="true" create="false"/>
        <role name="durpublisher" read="true" write="true" create="true"/>
      </security>
    </attribute>
  </mbean>

</server> 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值