将 Apache ActiveMQ Classic 与 JBoss 集成
连接性 > 容器 > 将 Apache ActiveMQ Classic 与 JBoss 集成
将 Apache ActiveMQ Classic 与 JBoss 集成
在企业 Java 世界中,与应用程序服务器集成是一种常见场景,尤其是在消息传递方面。ActiveMQ Classic 是一个符合 JMS 1.1 标准的开源 Apache 许可的消息中间件 (MOM),它拥有 许多,许多 超越 JMS 规范的功能。ActiveMQ Classic 提供了许多不同的 连接点,许多 跨语言客户端 以及许多 可插拔的传输协议,包括与任何 J2EE 1.4 应用程序服务器集成。
开源世界中的应用程序服务器之一是 JBoss。一个非常常见的需求是将 ActiveMQ Classic 配置为 JBoss 中的消息基础设施。尽管关于这种集成的 文档不多,但这篇文章旨在提供更多细节和解释。因此,如果您需要将 ActiveMQ Classic 与 JBoss 集成,这篇文章适合您。
这篇文章介绍了如何配置 JBoss 以使其在生命周期中启动 ActiveMQ Classic,以及如何配置 ActiveMQ Classic 资源适配器以处理 ActiveMQ Classic 与 JBoss 之间的消息传递和事务性。
需求
以下是本文的软件需求,以及下载每个软件的链接。
尽管本文使用的是 Unix,但安装和集成将在运行 Sun Java 的任何平台上运行。建议在按照本文步骤操作之前下载每个软件。下载完每个软件后,请继续执行第一步。
安装 J2SE 1.5
此过程的第一步是安装 Java 1.5 并验证其正常运行。使用上面的链接找到、下载并安装适合您平台的正确版本的 Java。安装完 Java 并将其添加到 PATH 后,使用以下命令测试它是否正常运行。
$ java -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-112)
Java HotSpot(TM) Client VM (build 1.5.0_06-64, mixed mode, sharing)
根据您的平台和 Java 1.5 的确切版本号,您的输出可能略有不同。只要它是 Java 1.5 并且输出版本信息,您就可以继续执行下一步。
安装 Apache Ant
第二步是安装 Apache Ant。只需使用上面的链接下载它,将其解压缩到硬盘上的某个位置,并将 bin
目录放在 PATH 中。这样就可以使用以下命令快速对其进行测试。
$ ant -version
Apache Ant version 1.6.2 compiled on July 16 2004
只要您看到上面的版本输出,Ant 就可以使用。如果您没有看到版本输出或收到错误,请咨询 Ant 文档或邮件列表档案以解决问题。请注意,在完成整个操作并测试集成之前,不会使用 Ant。
安装 JBoss 应用程序服务器
此过程的第三步是安装 JBoss,并确保在安装和配置 ActiveMQ Classic 之前它能正常运行。下载 JBoss-4.0.4 后,将其解压缩到可以创建目录的位置。接下来,使用以下命令运行服务器。
$ cd jboss-4.0.4.GA
$ ./bin/run.sh -c default
=========================================================================
JBoss Bootstrap Environment
JBOSS_HOME: /opt/jboss-4.0.4.GA
JAVA: java
JAVA_OPTS: -server -Xms128m -Xmx512m -Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000 -Dprogram.name=run.sh
CLASSPATH: /opt/jboss-4.0.4.GA/bin/run.jar:/lib/tools.jar
=========================================================================
15:34:47,999 INFO [Server] Starting JBoss (MX MicroKernel)...
15:34:48,001 INFO [Server] Release ID: JBoss [Zion] 4.0.4.GA (build: CVSTag=JBoss\_4\_0\_4\_GA date=200605151000)
15:34:48,004 INFO [Server] Home Dir: /opt/jboss-4.0.4.GA
15:34:48,005 INFO [Server] Home URL: file:/opt/jboss-4.0.4.GA/
15:34:48,007 INFO [Server] Patch URL: null
15:34:48,007 INFO [Server] Server Name: default
15:34:48,007 INFO [Server] Server Home Dir: /opt/jboss-4.0.4.GA/server/default
15:34:48,011 INFO [Server] Server Home URL: file:/opt/jboss-4.0.4.GA/server/default/
15:34:48,012 INFO [Server] Server Log Dir: /opt/jboss-4.0.4.GA/server/default/log
15:34:48,017 INFO [Server] Server Temp Dir: /opt/jboss-4.0.4.GA/server/default/tmp
15:34:48,022 INFO [Server] Root Deployment Filename: jboss-service.xml
...
15:35:17,360 INFO [Server] JBoss (MX MicroKernel) [4.0.4.GA (build: CVSTag=JBoss\_4\_0\_4\_GA date=200605151000)]
Started in 22s:238ms
JBoss 启动输出的前几行显示了正在使用的配置,但最后一行是最重要的。它告诉您 JBoss 已成功启动到您的系统。为了确保万无一失,请在 Web 浏览器中访问 https://127.0.0.1:8080/web-console/,以确保您能看到 JBoss Web 控制台。如果您可以看到此控制台,那么一切准备就绪。
顺便说一下,Web 控制台的左侧需要 Java 插件 正确安装。这应该在安装 J2SE 时完成,所以如果它对您来说不起作用,我建议您查阅一些关于您可能看到的任何错误的文档。Java 插件不是 JBoss 或 ActiveMQ Classic 正常运行的必要条件,它仅仅是为了 JBoss Web 控制台。
JBoss 正确安装后,使用关闭脚本或简单地键入 ctrl-c 激活关闭挂钩来将其关闭。关闭后,请继续执行下一步。
准备将 Apache ActiveMQ Classic 与 JBoss 应用程序服务器集成
第四步是准备您的环境以将 ActiveMQ Classic 与 JBoss 集成。如果您还没有这样做,请使用上面的链接下载 Apache ActiveMQ Classic。在撰写本文时,最新发布的版本是 4.0.2-RC4。下载此档案后,将其解压缩到可以创建目录的位置,最好是与 JBoss 解压缩到同一位置。使用以下命令验证 ActiveMQ Classic RAR 文件是否已包含在内。
$ cd ./incubator-activemq-4.0.2.tar.gz
$ jar tvf /opt/incubator-activemq-4.0.2/lib/optional/activemq-ra-4.0.2.rar
0 Mon Sep 25 19:00:50 MDT 2006 META-INF/
399 Mon Sep 25 19:00:48 MDT 2006 META-INF/MANIFEST.MF
523 Mon Sep 25 13:07:40 MDT 2006 META-INF/DISCLAIMER.txt
11359 Mon Sep 25 13:07:40 MDT 2006 META-INF/LICENSE.txt
20305 Mon Sep 25 13:07:40 MDT 2006 META-INF/ra.xml
2334 Mon Sep 25 13:07:40 MDT 2006 broker-config.xml
70023 Mon Sep 25 19:00:48 MDT 2006 activemq-ra-4.0.2.jar
1351744 Mon Sep 25 19:00:14 MDT 2006 activemq-core-4.0.2.jar
232107 Mon Sep 25 18:22:48 MDT 2006 activeio-core-3.0-beta4.jar
2143211 Tue Aug 01 11:44:50 MDT 2006 derby-10.1.1.0.jar
1901653 Tue Aug 01 11:47:08 MDT 2006 spring-1.2.6.jar
94713 Tue Aug 01 11:47:22 MDT 2006 xbean-spring-2.2.jar
52915 Tue Aug 01 12:22:16 MDT 2006 commons-logging-1.1.jar
16030 Tue Aug 01 12:22:32 MDT 2006 geronimo-j2ee-management\_1.0\_spec-1.0.jar
329586 Tue Aug 01 12:22:54 MDT 2006 backport-util-concurrent-2.1.jar
358085 Tue Aug 01 12:23:26 MDT 2006 log4j-1.2.12.jar
523 Mon Sep 25 19:00:50 MDT 2006 META-INF/DISCLAIMER.txt
11359 Mon Sep 25 19:00:50 MDT 2006 META-INF/LICENSE.txt
这只是 RAR 文件的目录表。只有在以下情况下才会失败 - ActiveMQ Classic tarball 或 zip 文件下载不完整。除此之外,根据您下载的版本,一些库版本可能略有不同。
现在回到 JBoss 安装目录,在 JBoss deploy 目录中为 ActiveMQ Classic 创建一个目录,用于默认的 JBoss 上下文。以下是在执行此任务时使用的命令。
$ mkdir /opt/jboss-4.0.4.GA/server/default/deploy/activemq-ra.rar
$ cd /opt/jboss-4.0.4.GA/server/default/deploy/activemq-ra.rar
$ pwd
/opt/jboss-4.0.4.GA/server/default/deploy/activemq-ra.rar
`注意:** 创建目录不是必需的,但这是在您刚开始使用时设置 ActiveMQ Classic RAR 的最简单方法。这是因为它在开发阶段提供了灵活性,可以非常轻松地更改配置。另一种方法是在配置足够稳定不再需要更改时,将目录打包成 RAR 文件。但在开发期间将所有内容保留在目录中是最简单的途径。
现在将 activemq-ra-4.0.2.rar 解压缩到当前工作目录。
jar xvf /opt/incubator-activemq-4.0.2/lib/optional/activemq-ra-4.0.2.rar
created: META-INF/
inflated: META-INF/MANIFEST.MF
inflated: META-INF/DISCLAIMER.txt
inflated: META-INF/LICENSE.txt
inflated: META-INF/ra.xml
inflated: broker-config.xml
inflated: activemq-ra-4.0.2.jar
inflated: activemq-core-4.0.2.jar
inflated: activeio-core-3.0-beta4.jar
inflated: derby-10.1.1.0.jar
inflated: spring-1.2.6.jar
inflated: xbean-spring-2.2.jar
inflated: commons-logging-1.1.jar
inflated: geronimo-j2ee-management\_1.0\_spec-1.0.jar
inflated: backport-util-concurrent-2.1.jar
inflated: log4j-1.2.12.jar
inflated: META-INF/DISCLAIMER.txt
inflated: META-INF/LICENSE.txt
以下是该目录内容的快速列表。
$ ls -l
total 12848
drwxr-xr-x 6 bsnyder bsnyder 204 Oct 16 16:27 META-INF
-rw-r--r-- 1 bsnyder bsnyder 232107 Oct 16 16:27 activeio-core-3.0-beta4.jar
-rw-r--r-- 1 bsnyder bsnyder 1351744 Oct 16 16:27 activemq-core-4.0.2.jar
-rw-r--r-- 1 bsnyder bsnyder 70023 Oct 16 16:27 activemq-ra-4.0.2.jar
-rw-r--r-- 1 bsnyder bsnyder 329586 Oct 16 16:27 backport-util-concurrent-2.1.jar
-rw-r--r-- 1 bsnyder bsnyder 2334 Oct 16 16:27 broker-config.xml
-rw-r--r-- 1 bsnyder bsnyder 52915 Oct 16 16:27 commons-logging-1.1.jar
-rw-r--r-- 1 bsnyder bsnyder 2143211 Oct 16 16:27 derby-10.1.1.0.jar
-rw-r--r-- 1 bsnyder bsnyder 16030 Oct 16 16:27 geronimo-j2ee-management\_1.0\_spec-1.0.jar
-rw-r--r-- 1 bsnyder bsnyder 358085 Oct 16 16:27 log4j-1.2.12.jar
-rw-r--r-- 1 bsnyder bsnyder 1901653 Oct 16 16:27 spring-1.2.6.jar
-rw-r--r-- 1 bsnyder bsnyder 94713 Oct 16 16:27 xbean-spring-2.2.jar
现在该配置 ActiveMQ Classic 了。
配置 Apache ActiveMQ Classic
第五步是实际配置 ActiveMQ Classic 以与 JBoss 集成。请记住,您应该位于以下目录中。
/opt/jboss-4.0.4.GA/server/default/deploy/activemq-ra.rar
您可能已经或可能没有将 JBoss 安装在 /opt
中,这并不重要。重要的是您位于上面创建的目录中,该目录包含解压缩的 ActiveMQ Classic RAR 文件的内容。
`注意:** RAR 文件是资源适配器档案 (RAR)。资源适配器是 J2EE 连接器架构 (JCA) 中的概念,用于与企业信息系统 (EIS) 交互,即与应用程序服务器外部的系统交互(例如,关系数据库、大型机、MOM、会计系统等)。资源适配器通常被称为 J2EE 连接器,与用于打印机的设备驱动程序的概念非常相似,因为它们包含与连接到特定系统相关的特定信息。JCA 与之不同的是,这种连接已在 Java 规范中正式化。因此,JCA 的总体概念是连接到任何 EIS,但这意味着什么呢?JCA 1.5 通过以下协议提供连接和更多功能。
1.0 版协议
在连接器架构的 1.0 版中,定义了三个协议来解决上述功能。
- 连接管理协议:允许应用程序通过资源适配器连接到 EIS。它还允许应用程序服务器将连接请求池化到 EIS。
- 事务管理协议:允许应用程序管理和跨多个 EIS 资源管理器执行事务访问。
- 安全协议:提供对 EIS 的安全访问支持。
1.5 版中的新协议
在 J2EE 连接器架构的 1.5 版中,资源适配器必须支持更多协议,因为新功能和特性已融入规范。资源适配器可以通过实现规范中为每个协议定义的必需接口来支持这四个新协议。
- 生命周期管理协议:允许应用程序服务器管理资源适配器的生命周期,即启动和关闭功能。
- 工作管理协议:允许资源适配器通过将其提交给应用程序服务器以执行来执行工作。由于应用程序服务器为资源适配器执行工作,因此资源适配器不必担心线程管理。相反,应用程序服务器可以高效地管理这方面,并在必要时使用线程池。尽管工作管理协议不是必需的(资源适配器可以选择管理自己的工作线程),但它绝对是推荐的。
- 事务流入协议:允许资源适配器将导入的事务传播到应用程序服务器,以及由 EIS 启动的事务完成和崩溃恢复流入。
- 消息流入协议:允许资源适配器同步或异步地将消息传递到应用程序服务器中的端点,而与消息类型、语义和基础结构无关。
有关 JCA 的更多信息,请查阅 J2EE 连接器架构文档。
打开 META-INF/ra.xml
文件,并查找以下部分。
`META-INF/ra.xml**
<config-property>
<description>
The URL to the ActiveMQ Classic server that you want this connection to connect to. If using
an embedded broker, this value should be 'vm://127.0.0.1'.
</description>
<config-property-name>ServerUrl</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>tcp://127.0.0.1:61616</config-property-value>
<!-- <config-property-value>vm://127.0.0.1</config-property-value> -->
</config-property>
上面的部分用于告诉 ActiveMQ Classic RAR ActiveMQ Classic 的位置。默认情况下,in-VM 协议被注释掉,以支持 tcp 协议。这将在 localhost 上的任何接口上的端口 61616 上查找正在运行的 ActiveMQ Classic。如果您不介意通过 TCP 在 JVM 内进行通信的效率低下,可以将其保留原样。但是,建议将 vm://
传输用于嵌入式代理,因此请注释掉 tcp://
传输,并取消注释 vm://
传输。以下是一个示例。
`META-INF/ra.xml**
<config-property>
<description>
The URL to the ActiveMQ Classic server that you want this connection to connect to. If using
an embedded broker, this value should be 'vm://127.0.0.1'.
</description>
<config-property-name>ServerUrl</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<!-- <config-property-value>tcp://127.0.0.1:61616</config-property-value> -->
<config-property-value>vm://127.0.0.1</config-property-value>
</config-property>
因为我们将 ActiveMQ Classic 嵌入到 JBoss 中,所以使用 vm://
传输比通过 tcp://
传输进行消息传递更有效。
现在,继续浏览 META-INF/ra.xml
文件,找到以下部分。
`META-INF/ra.xml**
<config-property>
<description>
Sets the XML configuration file used to configure the embedded ActiveMQ Classic broker via
Spring if using embedded mode.
BrokerXmlConfig is the filename which is assumed to be on the classpath unless
a URL is specified. So a value of foo/bar.xml would be assumed to be on the
classpath whereas file:dir/file.xml would use the file system.
Any valid URL string is supported.
</description>
<config-property-name>BrokerXmlConfig</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value></config-property-value>
<!--
<config-property-value>xbean:broker-config.xml</config-property-value>
-->
</config-property>
上面的部分需要更改,取消注释倒数第二行,并删除/替换其上方的空元素。以下是如何更改此部分的示例。
`META-INF/ra.xml**
<config-property>
<description>
Sets the XML configuration file used to configure the embedded ActiveMQ Classic broker via
Spring if using embedded mode.
BrokerXmlConfig is the filename which is assumed to be on the classpath unless
a URL is specified. So a value of foo/bar.xml would be assumed to be on the
classpath whereas file:dir/file.xml would use the file system.
Any valid URL string is supported.
</description>
<config-property-name>BrokerXmlConfig</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>xbean:broker-config.xml</config-property-value>
</config-property>
此更改告诉 ActiveMQ Classic RAR 读取名为 broker-config.xml
的配置文件(xbean:
在文件名之前,只是一个提示,表示读取配置文件的类) ,该文件位于 CLASSPATH 上。在本例中,broker-config.xml
文件位于 activemq-ra.rar
目录中。保存对该文件的更改,然后打开 broker-config.xml
文件。
broker-config.xml
文件是ActiveMQ Classic 配置文件。这是用于配置 ActiveMQ Classic 的文件。此文件的默认内容可用,但应根据您的环境进行自定义。有关此配置,需要注意几个事项。此文件中需要注意的最突出的部分是 <persistenceAdapter>
元素以及 <transportConnectors>
和 <networkConnectors>
元素,如下所示
`broker-config.xml**
<beans xmlns="http://activemq.org/config/1.0">
<broker useJmx="true">
...
<persistenceAdapter>
<journaledJDBC journalLogFiles="5" dataDirectory="activemq-data"/>
<!-- To use a different datasource, use th following syntax : -->
<!--
<journaledJDBC journalLogFiles="5" dataDirectory="../data" dataSource="#postgres-ds"/>
-->
</persistenceAdapter>
<transportConnectors>
<!-- prefixing a connector with discovery: causes the connector to be advertiesed over rendezvous -->
<transportConnector uri="tcp://127.0.0.1:61616" discoveryUri="multicast://default"/>
</transportConnectors>
<networkConnectors>
<!-- by default just auto discover the other brokers -->
<networkConnector uri="multicast://default"/>
<!--
<networkConnector uri="static://(tcp://host1:61616,tcp://host2:61616)"/>
-->
</networkConnectors>
</broker>
</beans>
对该文件的第一个更改是将 brokerName 属性添加到 broker 元素并提供名称
<broker useJmx="true" brokerName="bruce.broker1">
此外,在配置的更下方也使用相同的名称,为 <transportConnector>
元素提供名称
<transportConnector name="bruce.broker1" uri="tcp://127.0.0.1:61616" discoveryUri="multicast://default"/>
现在,我们将告诉 ActiveMQ Classic 不要初始化 JMX,因为我们将使用 JBoss 现有的 JMX
<!-- put the following as the first child of the broker tag -->
<managementContext><!-- we'll use an existing one (JBoss) instead of creating one -->
<managementContext createConnector="false"/>
</managementContext>
<persistenceAdapter>
元素应重新配置,以将其数据存储在适当的位置。在 JBoss 上,这很可能是在您使用的服务器配置的“data”目录中。我们将使用 XBean 和 Spring 功能动态设置它,该功能允许我们将系统属性值注入配置。首先,需要启用它
<!-- put the following as the first child of the beans element -->
<bean xmlns="" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
现在,将 journaledJDBC
元素的 dataDirectory
属性修改为:${jboss.server.data.dir}/activemq
。
<transportConnectors>
元素用于为客户端到代理的通信宣传 ActiveMQ Classic 代理,而 <networkConnectors>
元素用于为代理到代理的通信宣传 ActiveMQ Classic 代理。默认配置是使用 ActiveMQ Classic 的 多播传输 用于两者。这仅仅是一个简单的配置,可以轻松地启动和运行 ActiveMQ Classic,所以我们暂时就将其保留为默认配置。
`注意:** ActiveMQ Classic 提供的配置选项远不止这里提到的。上面的配置只够启动和运行 ActiveMQ Classic,除此之外别无他用。有关 ActiveMQ Classic 配置的更多信息,请参阅 ActiveMQ Classic 4.1 XML 参考。
现在,我们只需要启动 JBoss 以确保它使用之前启动 JBoss 所用的相同命令正确启动,没有错误
$ cd jboss-4.0.4.GA
$ ./bin/run.sh -c default
=========================================================================
JBoss Bootstrap Environment
JBOSS_HOME: /opt/jboss-4.0.4.GA
JAVA: java
JAVA_OPTS: -server -Xms128m -Xmx512m -Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000 -Dprogram.name=run.sh
CLASSPATH: /opt/jboss-4.0.4.GA/bin/run.jar:/lib/tools.jar
=========================================================================
15:34:47,999 INFO [Server] Starting JBoss (MX MicroKernel)...
15:34:48,001 INFO [Server] Release ID: JBoss [Zion] 4.0.4.GA (build: CVSTag=JBoss\_4\_0\_4\_GA date=200605151000)
15:34:48,004 INFO [Server] Home Dir: /opt/jboss-4.0.4.GA
15:34:48,005 INFO [Server] Home URL: file:/opt/jboss-4.0.4.GA/
15:34:48,007 INFO [Server] Patch URL: null
15:34:48,007 INFO [Server] Server Name: default
15:34:48,007 INFO [Server] Server Home Dir: /opt/jboss-4.0.4.GA/server/default
15:34:48,011 INFO [Server] Server Home URL: file:/opt/jboss-4.0.4.GA/server/default/
15:34:48,012 INFO [Server] Server Log Dir: /opt/jboss-4.0.4.GA/server/default/log
15:34:48,017 INFO [Server] Server Temp Dir: /opt/jboss-4.0.4.GA/server/default/tmp
15:34:48,022 INFO [Server] Root Deployment Filename: jboss-service.xml
...
15:35:17,360 INFO [Server] JBoss (MX MicroKernel) [4.0.4.GA (build: CVSTag=JBoss\_4\_0\_4\_GA date=200605151000)]
Started in 28s:576ms
只要 JBoss 启动没有错误,您就可以继续执行下一步。
配置 JBoss
第六步是配置 JBoss,以便在 JBoss 启动时初始化和启动 ActiveMQ Classic。这是使用一个 XML 文件来完成的,该文件遵守 JBoss JCA DTD 用于数据源。与市场上的大多数其他 Java 应用程序服务器一样,JBoss 架构使用 J2EE 连接器体系结构来管理任何类型的连接,包括 JDBC、JMS 等,而 JBoss JCA DTD 表示用于创建 XML 数据源实例的允许内容,以配置 JBoss JCA。以下是一个与 JBoss 一起使用的 XML 数据源实例示例
`activemq-jms-ds.xml**
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE connection-factories
PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
"https://www.jboss.com.cn/j2ee/dtd/jboss-ds\_1\_5.dtd">
<connection-factories>
<tx-connection-factory>
<jndi-name>activemq/QueueConnectionFactory</jndi-name>
<xa-transaction/>
<track-connection-by-tx/>
<rar-name>activemq-ra.rar</rar-name>
<connection-definition>javax.jms.QueueConnectionFactory</connection-definition>
<ServerUrl>vm://127.0.0.1</ServerUrl>
<!--
<UserName>sa</UserName>
<Password></Password>
-->
<min-pool-size>1</min-pool-size>
<max-pool-size>200</max-pool-size>
<blocking-timeout-millis>30000</blocking-timeout-millis>
<idle-timeout-minutes>3</idle-timeout-minutes>
</tx-connection-factory>
<tx-connection-factory>
<jndi-name>activemq/TopicConnectionFactory</jndi-name>
<xa-transaction/>
<track-connection-by-tx/>
<rar-name>activemq-ra.rar</rar-name>
<connection-definition>javax.jms.TopicConnectionFactory</connection-definition>
<ServerUrl>vm://127.0.0.1</ServerUrl>
<!--
<UserName>sa</UserName>
<Password></Password>
-->
<min-pool-size>1</min-pool-size>
<max-pool-size>200</max-pool-size>
<blocking-timeout-millis>30000</blocking-timeout-millis>
<idle-timeout-minutes>3</idle-timeout-minutes>
</tx-connection-factory>
<mbean code="org.jboss.resource.deployment.AdminObject" name="activemq.queue:name=outboundQueue">
<attribute name="JNDIName">activemq/queue/outbound</attribute>
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='activemq-ra.rar'</depends>
<attribute name="Type">javax.jms.Queue</attribute>
<attribute name="Properties">PhysicalName=queue.outbound</attribute>
</mbean>
<mbean code="org.jboss.resource.deployment.AdminObject" name="activemq.topic:name=inboundTopic">
<attribute name="JNDIName">activemq/topic/inbound</attribute>
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='activemq-ra.rar'</depends>
<attribute name="Type">javax.jms.Topic</attribute>
<attribute name="Properties">PhysicalName=topic.inbound</attribute>
</mbean>
</connection-factories>
此 XML 实例配置了一个 JMS QueueConnectionFactory
和一个 JMS TopicConnectionFactory
,并通过 JNDI 使它们可用。此文件中还定义了一些 s,这些 s 用于指定主题和队列。此文件应放到 JBoss 部署目录中。它的名称(*-ds.xml)将使其在启动时被 JBoss 部署程序识别。说到启动,一旦该文件就位,就可以通过简单地启动 JBoss 服务器来执行简单的冒烟测试。以下是应该看到的输出示例
=========================================================================
JBoss Bootstrap Environment
JBOSS_HOME: /opt/jboss
JAVA: java
JAVA_OPTS: -server -Xms128m -Xmx512m -Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000 -Dprogram.name=run.sh
CLASSPATH: /opt/jboss/bin/run.jar:/lib/tools.jar
=========================================================================
22:55:48,686 INFO [Server] Starting JBoss (MX MicroKernel)...
22:55:48,688 INFO [Server] Release ID: JBoss [Zion] 4.0.4.GA (build: CVSTag=JBoss\_4\_0\_4\_GA date=200605151000)
22:55:48,690 INFO [Server] Home Dir: /opt/jboss-4.0.4.GA
22:55:48,692 INFO [Server] Home URL: file:/opt/jboss-4.0.4.GA/
22:55:48,695 INFO [Server] Patch URL: null
22:55:48,697 INFO [Server] Server Name: default
22:55:48,698 INFO [Server] Server Home Dir: /opt/jboss-4.0.4.GA/server/default
22:55:48,701 INFO [Server] Server Home URL: file:/opt/jboss-4.0.4.GA/server/default/
22:55:48,702 INFO [Server] Server Log Dir: /opt/jboss-4.0.4.GA/server/default/log
22:55:48,704 INFO [Server] Server Temp Dir: /opt/jboss-4.0.4.GA/server/default/tmp
22:55:48,706 INFO [Server] Root Deployment Filename: jboss-service.xml
22:55:49,092 INFO [ServerInfo] Java version: 1.5.0_06,Apple Computer, Inc.
22:55:49,101 INFO [ServerInfo] Java VM: Java HotSpot(TM) Server VM 1.5.0_06-64,"Apple Computer, Inc."
22:55:49,102 INFO [ServerInfo] OS-System: Mac OS X 10.4.8,i386
22:55:49,803 INFO [Server] Core system initialized
22:55:53,379 INFO [WebService] Using RMI server codebase: http://rattlesnake:8083/
22:55:53,400 INFO [Log4jService$URLWatchTimerTask] Configuring from URL: resource:log4j.xml
22:55:54,034 INFO [NamingService] JNDI bootstrap JNP=/0.0.0.0:1099, RMI=/0.0.0.0:1098, backlog=50,
no client SocketFactory, Server SocketFactory=class
org.jboss.net.sockets.DefaultSocketFactory
22:55:58,475 INFO [Embedded] Catalina naming disabled
22:55:58,566 INFO [ClusterRuleSetFactory] Unable to find a cluster rule set in the classpath.
Will load the default rule set.
22:55:58,569 INFO [ClusterRuleSetFactory] Unable to find a cluster rule set in the classpath.
Will load the default rule set.
22:55:59,110 INFO [Http11BaseProtocol] Initializing Coyote HTTP/1.1 on http-0.0.0.0-8080
22:55:59,114 INFO [Catalina] Initialization processed in 545 ms
22:55:59,116 INFO [StandardService] Starting service jboss.web
22:55:59,121 INFO [StandardEngine] Starting Servlet Engine: Apache Tomcat/5.5.17
22:55:59,179 INFO [StandardHost] XML validation disabled
22:55:59,221 INFO [Catalina] Server startup in 105 ms
22:55:59,600 INFO [TomcatDeployer] deploy, ctxPath=/invoker, warUrl=.../deploy/http-invoker.sar/invoker.war/
22:55:59,874 INFO [WebappLoader] Dual registration of jndi stream handler: factory already defined
22:56:00,899 INFO [TomcatDeployer] deploy, ctxPath=/, warUrl=.../deploy/jbossweb-tomcat55.sar/ROOT.war/
22:56:01,700 INFO [TomcatDeployer] deploy, ctxPath=/jbossws, warUrl=.../tmp/deploy/tmp60528jbossws-exp.war/
22:56:01,891 INFO [SubscriptionManager] Bound event dispatcher to java:/EventDispatcher
22:56:02,203 INFO [TomcatDeployer] deploy, ctxPath=/jbossmq-httpil,
warUrl=.../deploy/jms/jbossmq-httpil.sar/jbossmq-httpil.war/
22:56:04,546 INFO [TomcatDeployer] deploy, ctxPath=/web-console,
warUrl=.../deploy/management/console-mgr.sar/web-console.war/
22:56:05,690 INFO [MailService] Mail Service bound to java:/Mail
22:56:07,215 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in
.../deploy/activemq-ra.rar/
22:56:07,452 INFO [XBeanXmlBeanDefinitionReader] Loading XML bean definitions from class
path resource [broker-config.xml]
22:56:07,750 INFO [ClassPathXmlApplicationContext] Bean factory for application context
[org.apache.xbean.spring.context.ClassPathXmlApplicationContext;hashCode=13887543]:
org.springframework.beans.factory.support.DefaultListableBeanFactory defining
beans [org.apache.activemq.xbean.XBeanBrokerService]; root of BeanFactory hierarchy
22:56:07,765 INFO [ClassPathXmlApplicationContext] 1 beans defined in application context
[org.apache.xbean.spring.context.ClassPathXmlApplicationContext;hashCode=13887543]
22:56:07,773 INFO [CollectionFactory] JDK 1.4+ collections available
22:56:07,778 INFO [ClassPathXmlApplicationContext] Unable to locate MessageSource with name
'messageSource': using default
[org.springframework.context.support.DelegatingMessageSource@5fee96]
22:56:07,781 INFO [ClassPathXmlApplicationContext] Unable to locate ApplicationEventMulticaster
with name 'applicationEventMulticaster': using default
[org.springframework.context.event.SimpleApplicationEventMulticaster@78c714]
22:56:07,783 INFO [DefaultListableBeanFactory] Pre-instantiating singletons in factory
[org.springframework.beans.factory.support.DefaultListableBeanFactory
defining beans [org.apache.activemq.xbean.XBeanBrokerService]; root of BeanFactory hierarchy]
22:56:08,181 INFO [BrokerService] ActiveMQ 4.0.2 JMS Message Broker (bruce.broker1) is starting
22:56:08,181 INFO [BrokerService] For help or more information please see:
http://incubator.apache.org/activemq/
22:56:09,989 INFO [JDBCPersistenceAdapter] Database driver recognized:
[apache\_derby\_embedded\_jdbc\_driver]
22:56:11,026 INFO [JournalPersistenceAdapter] Journal Recovery Started from: Active Journal:
using 5 x 20.0 Megs at: /opt/jboss-4.0.4.GA/activemq-data/journal
22:56:11,169 INFO [JournalPersistenceAdapter] Journal Recovered: 0 message(s) in transactions recovered.
22:56:11,489 INFO [TransportServerThreadSupport] Listening for connections at: tcp://rattlesnake:61616
22:56:11,491 WARN [MulticastDiscoveryAgent] brokerName not set
22:56:11,519 INFO [TransportConnector] Connector bruce.broker1 Started
22:56:11,522 INFO [NetworkConnector] Network Connector bridge Started
22:56:11,522 INFO [BrokerService] ActiveMQ JMS Message Broker
(bruce.broker1, ID:rattlesnake-59052-1161060967859-1:0) started
22:56:11,556 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in
.../deploy/jboss-ha-local-jdbc.rar
22:56:11,599 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in
.../deploy/jboss-ha-xa-jdbc.rar
22:56:11,623 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in
.../deploy/jboss-local-jdbc.rar
22:56:11,647 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in
.../deploy/jboss-xa-jdbc.rar
22:56:11,737 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in
.../deploy/jms/jms-ra.rar
22:56:11,847 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in
.../deploy/mail-ra.rar
22:56:12,251 INFO [ConnectionFactoryBindingService] Bound ConnectionManager
'jboss.jca:service=ConnectionFactoryBinding,name=activemq/QueueConnectionFactory' to
JNDI name 'java:activemq/QueueConnectionFactory'
22:56:12,258 INFO [ConnectionFactoryBindingService] Bound ConnectionManager
'jboss.jca:service=ConnectionFactoryBinding,name=activemq/TopicConnectionFactory' to
JNDI name 'java:activemq/TopicConnectionFactory'
22:56:12,265 INFO [AdminObject] Bound admin object 'org.apache.activemq.command.ActiveMQQueue'
at 'activemq/queue/outbound'
22:56:12,330 INFO [AdminObject] Bound admin object 'org.apache.activemq.command.ActiveMQTopic'
at 'activemq/topic/inbound'
22:56:13,246 INFO [ConnectionFactoryBindingService] Bound ConnectionManager
'jboss.jca:service=DataSourceBinding,name=DefaultDS' to JNDI name 'java:DefaultDS'
22:56:13,842 INFO [A] Bound to JNDI name: queue/A
22:56:13,845 INFO [B] Bound to JNDI name: queue/B
22:56:13,846 INFO [C] Bound to JNDI name: queue/C
22:56:13,848 INFO [D] Bound to JNDI name: queue/D
22:56:13,850 INFO [ex] Bound to JNDI name: queue/ex
22:56:13,876 INFO [testTopic] Bound to JNDI name: topic/testTopic
22:56:13,879 INFO [securedTopic] Bound to JNDI name: topic/securedTopic
22:56:13,880 INFO [testDurableTopic] Bound to JNDI name: topic/testDurableTopic
22:56:13,883 INFO [testQueue] Bound to JNDI name: queue/testQueue
22:56:13,994 INFO [UILServerILService] JBossMQ UIL service available at : /0.0.0.0:8093
22:56:14,055 INFO [DLQ] Bound to JNDI name: queue/DLQ
22:56:14,375 INFO [ConnectionFactoryBindingService] Bound ConnectionManager
'jboss.jca:service=ConnectionFactoryBinding,name=JmsXA' to JNDI name 'java:JmsXA'
22:56:14,525 INFO [TomcatDeployer] deploy, ctxPath=/jmx-console, warUrl=.../deploy/jmx-console.war/
22:56:14,991 INFO [Http11BaseProtocol] Starting Coyote HTTP/1.1 on http-0.0.0.0-8080
22:56:15,071 INFO [ChannelSocket] JK: ajp13 listening on /0.0.0.0:8009
22:56:15,082 INFO [JkMain] Jk running ID=0 time=0/25 config=null
22:56:15,108 INFO [Server] JBoss (MX MicroKernel) [4.0.4.GA (build: CVSTag=JBoss\_4\_0\_4\_GA date=200605151000)]
Started in 26s:398ms
请注意来自 ActiveMQ Classic 和 AdminObjects
的启动消息,这些消息创建了一个 ActiveMQQueue
和一个 ActiveMQTopic
。这些都是配置正确的良好指示,但需要进一步验证。下一节将对此进行介绍。
测试集成
第七步也是最后一步是执行集成更全面的冒烟测试。这可以通过使用 Apache Ant 通过 ActiveMQ Classic 二进制分发提供的示例来完成。包含了一个 Ant build.xml 文件,它提供了对简单消费者和简单生产者的轻松访问。生产者将用于发送被消费者接收的消息。要进行此测试,只需按照以下步骤操作
- 在第一个终端中,启动 JBoss。这里可以使用与上面相同的启动脚本。
- 在第二个终端中,使用以下命令运行 ActiveMQ Classic 消费者
$ cd /opt/incubator-activemq-4.0.2/examples #note in activemq v5 the directory is just "example" not "examples" $ ant consumer Buildfile: build.xml init: [mkdir] Created dir: /opt/incubator-activemq-4.0.2/example/target/classes [mkdir] Created dir: /opt/incubator-activemq-4.0.2/example/src/ddl compile: [javac] Compiling 6 source files to /opt/incubator-activemq-4.0.2/example/target/classes consumer: [echo] Running consumer against server at $url = tcp://127.0.0.1:61616 for subject $subject = TEST.FOO [java] Connecting to URL: tcp://127.0.0.1:61616 [java] Consuming queue: TEST.FOO [java] Using non-durable subscription [java] We are about to wait until we consume: 10 message(s) then we will shutdown
- 在第三个终端中,使用以下命令运行 ActiveMQ Classic 生产者
$ cd /opt/incubator-activemq-4.0.2/examples $ ant producer Buildfile: build.xml init: compile: producer: [echo] Running producer against server at $url = tcp://127.0.0.1:61616 for subject $subject = TEST.FOO [java] Connecting to URL: tcp://127.0.0.1:61616 [java] Publishing a Message with size 1000 to queue: TEST.FOO [java] Using non-durable publishing [java] Sleeping between publish 0 ms [java] Sending message: Message: 0 sent at: Mon Oct 16 23:21:08 MDT 2006 ... [java] Sending message: Message: 1 sent at: Mon Oct 16 23:21:08 MDT 2006 ... [java] Sending message: Message: 2 sent at: Mon Oct 16 23:21:08 MDT 2006 ... [java] Sending message: Message: 3 sent at: Mon Oct 16 23:21:08 MDT 2006 ... [java] Sending message: Message: 4 sent at: Mon Oct 16 23:21:08 MDT 2006 ... [java] Sending message: Message: 5 sent at: Mon Oct 16 23:21:08 MDT 2006 ... [java] Sending message: Message: 6 sent at: Mon Oct 16 23:21:08 MDT 2006 ... [java] Sending message: Message: 7 sent at: Mon Oct 16 23:21:08 MDT 2006 ... [java] Sending message: Message: 8 sent at: Mon Oct 16 23:21:08 MDT 2006 ... [java] Sending message: Message: 9 sent at: Mon Oct 16 23:21:08 MDT 2006 ... [java] Done. [java] connection { [java] session { [java] messageCount{ count: 10 unit: count startTime: 1161062468001 lastSampleTime: 1161062468340 description: Number of messages exchanged } [java] messageRateTime{ count: 10 maxTime: 142 minTime: 1 totalTime: 315 averageTime: 31.5 averageTimeExMinMax: 21.5 averagePerSecond: 31.746031746031747 averagePerSecondExMinMax: 46.51162790697674 unit: millis startTime: 1161062468002 lastSampleTime: 1161062468340 description: Time taken to process a message (thoughtput rate) } [java] pendingMessageCount{ count: 0 unit: count startTime: 1161062468001 lastSampleTime: 1161062468001 description: Number of pending messages } [java] expiredMessageCount{ count: 0 unit: count startTime: 1161062468001 lastSampleTime: 1161062468001 description: Number of expired messages } [java] messageWaitTime{ count: 0 maxTime: 0 minTime: 0 totalTime: 0 averageTime: 0.0 averageTimeExMinMax: 0.0 averagePerSecond: 0.0 averagePerSecondExMinMax: 0.0 unit: millis startTime: 1161062468002 lastSampleTime: 1161062468002 description: Time spent by a message before being delivered } [java] durableSubscriptionCount{ count: 0 unit: count startTime: 1161062468002 lastSampleTime: 1161062468002 description: The number of durable subscriptions } [java] producers { [java] producer queue://TEST.FOO { [java] messageCount{ count: 10 unit: count startTime: 1161062468025 lastSampleTime: 1161062468340 description: Number of messages processed } [java] messageRateTime{ count: 10 maxTime: 142 minTime: 1 totalTime: 315 averageTime: 31.5 averageTimeExMinMax: 21.5 averagePerSecond: 31.746031746031747 averagePerSecondExMinMax: 46.51162790697674 unit: millis startTime: 1161062468025 lastSampleTime: 1161062468340 description: Time taken to process a message (thoughtput rate) } [java] pendingMessageCount{ count: 0 unit: count startTime: 1161062468025 lastSampleTime: 1161062468025 description: Number of pending messages } [java] messageRateTime{ count: 10 maxTime: 142 minTime: 1 totalTime: 315 averageTime: 31.5 averageTimeExMinMax: 21.5 averagePerSecond: 31.746031746031747 averagePerSecondExMinMax: 46.51162790697674 unit: millis startTime: 1161062468025 lastSampleTime: 1161062468340 description: Time taken to process a message (thoughtput rate) } [java] expiredMessageCount{ count: 0 unit: count startTime: 1161062468025 lastSampleTime: 1161062468025 description: Number of expired messages } [java] messageWaitTime{ count: 0 maxTime: 0 minTime: 0 totalTime: 0 averageTime: 0.0 averageTimeExMinMax: 0.0 averagePerSecond: 0.0 averagePerSecondExMinMax: 0.0 unit: millis startTime: 1161062468025 lastSampleTime: 1161062468025 description: Time spent by a message before being delivered } [java] } [java] } [java] consumers { [java] } [java] } [java] }
步骤 1 只是启动 JBoss。步骤 2 启动与 ActiveMQ Classic 捆绑在一起的简单消息消费者。步骤 3 启动与 ActiveMQ Classic 捆绑在一起的简单消息生产者。尽管消息消费者和消息生产者是简单的实用程序,但它们都接受许多参数,这使得它们非常适合测试 ActiveMQ Classic 配置。
简而言之,刚刚发生的事情是消息生产者向 TEST.FOO 目标发送了 10 条消息,消息消费者从 TEST.FOO 目标接收了 10 条消息。尽管这是一个简单的测试,但它确实使用了 ActiveMQ Classic 代理,尽管只是在一台机器上。下一个合乎逻辑的步骤是设置一个完整的 ActiveMQ Classic 代理网络。
在 JBoss 的一个实例中设置一个代理后,设置另一个代理就容易多了,但需要另一台机器或操作系统实例。但那是另一篇文章的主题,我们以后再讨论。
结论
这里演示的是 ActiveMQ Classic 与 JBoss 应用程序服务器的集成。这种集成非常常见,许多企业都采用这种集成。我希望这对那些对 ActiveMQ Classic 与 JBoss 应用程序服务器集成感兴趣的人有所帮助。
资源
以下是与 Spring 1.x 和 Spring 2.x 一起使用的配置
2007 年 10 月 3 日,由 Bruce Snyder 修改
标签
- 没有标签
- 编辑标签
预览
2007 年 10 月 3 日,由 Bruce Snyder 修改
标签
- 没有标签
- 编辑标签
预览