将 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。一个非常常见的需求是在 JBoss 中配置 ActiveMQ Classic 作为消息基础设施。尽管有一些关于此集成的文档,但这篇文章旨在提供更多细节和解释。因此,如果您需要将 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 部署目录中为 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
您可能已经或可能没有在/opt
中安装了 JBoss,这并不重要。重要的是您位于上面创建的目录中,该目录包含解压缩的 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>
对该文件进行的第一个更改是向 broker 元素添加 brokerName 属性并提供名称
<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。这是使用遵守 JBoss JCA DTD 的 XML 文件来实现的,该文件用于数据源。与市场上大多数其他 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,用于指定主题和队列。此文件应放入 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 应用程序服务器集成感兴趣的人有所帮助。如果您有任何问题,或者有兴趣咨询有关 ActiveMQ Classic 的服务,请 联系我们 以获取更多信息。
资源
以下是与 Spring 1.x 和 Spring 2.x 一起使用的配置
2007 年 10 月 3 日由 Bruce Snyder 修改
标签
- 无标签
- 编辑标签
预览
2007 年 10 月 3 日由 Bruce Snyder 修改
标签
- 无标签
- 编辑标签
预览