First Created: 09-15-2006
作者 : Sandeep Bangera
此 Demo application演示了如何配置和发布 Active MQ JCA 1.5 资源适配器到 OC4J 10g 10.1.3. 此资源适配器允许在 OC4J中使用 ActiveMQ
此 Demo application演示你如何做:
Outbound Communication: 配置 Stateless Session Bean 发送消息到一个 ActiveMQ的 queue中
Inbound Communication: 配置一个 Message Driven Bean接受从 ActiveMQ发送的消息。
此程序的 Javadoc位于 %HOWTO_HOME%/doc/javadoc/ 目录 .
配置文件位于 %HOWTO_HOME%/etc 目录 , 包括部署描述文件比如 application.xml.
ActiveMQ rar 不能直接发布到 OC4J中 .需做如下的小修改 :
注意 : 这些步骤在当前的 ActiveMQ 4.0.1 howto 中已经修改 . 如果你有用更新的 ActiveMQ ,你需要在最新的 ActiveMQ RAR 中作以上修改 .
<oracle:publishSharedLibrary
deployerUri="deployer:oc4j:${oc4j.host}:${oc4j.admin.port}"
userId="${oc4j.admin.user}"
password="${oc4j.admin.password}"
libraryName="${shared.library.name}"
libraryVersion="4.0.1"
logFile="${log.dir}/publish-library.log">
<oracle:uploadCodeSource path="${activemq.home}/${activemq.core.jar}" />
<!-- You may need to add these files to the shared library if you are interested
in ActiveMQ persistence features.
In adddition you will need to modify broker-config.xml in ra.jar to use spring properties -->
<!--
<oracle:uploadCodeSource path="${activemq.home}/lib/optional/spring-1.2.6.jar" />
<oracle:uploadCodeSource path="${activemq.home}/lib/optional/xbean-spring-2.2.jar" />
-->
</oracle:publishSharedLibrary>
<imported-shared-libraries>
<import-shared-library name="activemq.rar" max-version="4.0.1"/>
</imported-shared-libraries>
ActiveMQMessageDrivenEJBBean在 ejb-jar.xml中的部署描述如下:
<message-driven>
<description>Message Driven Bean</description>
<display-name>ActiveMQMessageDrivenEJB</display-name>
<ejb-name>ActiveMQMessageDrivenEJB</ejb-name>
<ejb-class>com.oracle.howto.activemq.ActiveMQMessageDrivenEJBBean</ejb-class>
<messaging-type>javax.jms.MessageListener</messaging-type>
<transaction-type>Container</transaction-type>
<activation-config>
<activation-config-property>
<activation-config-property-name>destination</activation-config-property-name>
<activation-config-property-value>queue.inbound </activation-config-property-value>
</activation-config-property>
<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-property>
<activation-config-property-name>messageSelector</activation-config-property-name>
<activation-config-property-value/>
</activation-config-property>
</activation-config>
</message-driven>
activation-config-property 用于将 MDB连接到 JCA。 destination属性值只能是与 ActiveMQ相关的特定值,并且只能是 MDB监听的队列的物理名。
上面定义的两个 activation configuration 与下面的定义在 ra.xml中的元素相关:
<inbound-resourceadapter>
<messageadapter>
<messagelistener>
<messagelistener-type>javax.jms.MessageListener</messagelistener-type>
<activationspec>
<activationspec-class>org.apache.activemq.ra.ActiveMQActivationSpec</activationspec-class>
<required-config-property>
<config-property-name>destination</config-property-name>
</required-config-property>
<required-config-property>
<config-property-name>destinationType</config-property-name>
</required-config-property>
</activationspec>
</messagelistener>
</messageadapter>
</inbound-resourceadapter>
用实际的目的 JNDI信息更新 orion-ejb-jar.xml. 它用于连接 inbound JMS Destination到 MDB
<message-driven-deployment name="ActiveMQMessageDrivenEJB" resource-adapter="activemq-rar"
connection-factory-location="activeMQ/QueueConnectionFactory" destination-location="activeMQJMS/MyQ">
</message-driven-deployment>
在 ejb.-jar.xml中更新 onMessage 需要的 transaction 信息
<container-transaction>
<method>
<ejb-name>ActiveMQMessageDrivenEJB</ejb-name>
<method-name>onMessage</method-name>
<method-params>
<method-param>javax.jms.Message</method-param>
</method-params>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<resource-ref>
<res-ref-name>jms/QCF</res-ref-name>
<res-type>javax.jms.QueueConnectionFactory</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>
<resource-env-ref>
<resource-env-ref-name>jms/QUEUE</resource-env-ref-name>
<resource-env-ref-type>javax.jms.Queue</resource-env-ref-type>
</resource-env-ref>
jms/QCF 是 ActiveMQEJBBean用 来查找 javax.jms.QueueConnectionFactory的 JNDI 名字,我们将配置它来指向 ActiveMQ QueueConnectionFactory.
上面定义的 resource-ref defined 将用来连接在 ra.xml中的如下元素
<outbound-resourceadapter>
<connection-definition>
<managedconnectionfactory-class>org.apache.activemq.ra.ActiveMQManagedConnectionFactory</managedconnectionfactory-class>
<connectionfactory-interface>javax.jms.ConnectionFactory</connectionfactory-interface>
<connectionfactory-impl-class>org.apache.activemq.ra.ActiveMQConnectionFactory</connectionfactory-impl-class>
<connection-interface>javax.jms.Connection</connection-interface>
<connection-impl-class>org.apache.activemq.ra.ManagedConnectionProxy</connection-impl-class>
</connection-definition>
<adminobject>
<adminobject-interface>javax.jms.Queue</adminobject-interface>
<adminobject-class>org.apache.activemq.command.ActiveMQQueue</adminobject-class>
<config-property>
<config-property-name>PhysicalName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
</adminobject>
下面的片段用以连接 Outbound队列 . 下面的片段位于 oc4j-connectors.xml 中
<connector name="activemq-rar" path="activemq-ra.rar" >
<adminobject-config location="activeMQJMS/MyQ">
<adminobject-class>org.apache.activemq.command.ActiveMQQueue</adminobject-class>
<config-property name="PhysicalName" value="queue.outbound"/>
</adminobject-config>
<adminobject-config location="activeMQJMS/MyT">
<adminobject-class>org.apache.activemq.command.ActiveMQTopic</adminobject-class>
<config-property name="PhysicalName" value="topic.outbound"/>
</adminobject-config>
</connector>
连接工厂在 oc4j-ra.xml中
<connector-factory location="activeMQ/QueueConnectionFactory" connector-name="activemq-rar">
<connection-pooling use="none">
</connection-pooling>
<security-config use="none">
</security-config>
<connectionfactory-interface>javax.jms.QueueConnectionFactory</connectionfactory-interface>
</connector-factory>
下面指示如何在 Oracle Containers for J2EE 10g (10.1.3). 中运行此演示程序
请检查并确保下面的属性在 howto.properties( 位于例子的根目录 ) 文件中正确配置 (注意 : 一些属性依赖于定义的环境变量,如果这些环境变量已经被设置,这些属性就不需要修改 ). 如果不要,根据你的环境修改如下变量 :
ActiveMQ 特定的属性
另外,请确保与 OC4J ant发布包联系的 ant命令在你的执行目录中 (%OC4J_HOME%/ant/bin ).
打开一新的 console 窗口 . 启动一 OC4J 10.1.3 实例 :
%OC4J_HOME%/bin/oc4j start
注意 oc4j 命令 要求 JAVA_HOME 环境变量,此变量指向安装好的 JDK
打开一新的 console窗口 . 启动一 ActiveMQ 10.1.3 实例 :
注意 activemq 命令 要求 JAVA_HOME 环境变量,此变量指向安装好的 JDK
打开一新的 console窗口,设置 ORACLE_HOME, ACTIVEMQ_HOME, JAVA_HOME环境变量。在 %HOWTO_HOME% 目录键入下面的命令以运行应用程序
现在,在 %HOWTO_HOME%/lib 目录 ,你应该创建了 active-mq.ear .
如果编译成功,此命令会试图发布应用程序。它将首先测试 OC4J是否运行。发布后,它将运行测试程序。测试程序将执行 JMS client, JMS client会发布消息带 MDB(通过 ActiveMQ的资源适配器) 监听的 ActiveMQ的 inbound队列中 。
你将在键入 ant命令的 console中看到如下消息:
" Sent message: Hello world to ActiveMQ inbound queue!"
转到启动 OC4J的 console中,你就看到 MDB 和 Stateless EJB 产生的输出:
"Inside MDB, received from inbound queue: Hello world to ActiveMQ inbound queue!
Message Received from MDB inside Session Bean: Hello world to ActiveMQ inbound queue!
Sending Message from Stateless EJB to ActiveMQ outbound queue: Hello world to ActiveMQ inbound queue!"
为验证 Stateless EJB发送到 ActiveMQ outbound队列“ queue.outbound”是否被 ActiveMQ成功接收,我们将使用 jconsole(JDK15缺省自带的 JMX浏览器 )
.
注:你也可以单独发布应用程序。 确保 已经设置 %ORACLE_HOME% 环境变量 ,从 %HOWTO_HOME% 目录,键入命令 :
如果你只有兴趣运行客户端,请键入命令:
你需要四个 console窗口运行此测试
通过此文档,你应该可以 :
学到在 OC4J 中如何配置和使用 ActiveMQ 的资源适配器进行 inbound 和 outbound 通讯。