我们最近发现大量的客户都有一个同样的问题:在运行于JBoss Wildfly 7中的HornetQ JMS实现和独立运行的ActiveMQ服务器之间,如何才能建立一个桥接。ActiveMQ作为一个独立运行的消息代理(message broker),一直是一个可靠的选择。而且随着Red Hat已经收购了Fusesource(译者注:Fusesource是ActiveMQ项目的维护组织,Red Hat此前在2006年收购了JBoss,现在JBoss和Fusesource都是Red Hat旗下的开源组织),在等待JBoss AMQ版本的ActiveMQ推出期间(译者注:JBoss基于ActiveMQ定制了一个新MQ,官方名称为JBoss A-MQ),这个问题尤其突出。
不使用桥接当然也是可能的,直接可以把ActiveMQ引入到JBoss,然后使用ActiveMQ上暴露的JMS队列。但是这个方式的缺点在于,如果ActiveMQ服务器由于某些原因停止工作的话,运行于JBoss中的JMS生产者将会失败,消费者也将会断开连接并且需要重连(译者注:原文拼写错误,误将reconnect拼写为reconnet)。一个更好的架构是,JBoss中的生产者先入列到一个本地HornetQ队列,然后将这些消息桥接到外部的ActiveMQ代理。在这个架构中,生产者可以在ActiveMQ宕机期间持续地入列消息,等到ActiveMQ再次工作时这些消息将会从HornetQ传输到ActiveMQ。
Ubuntu下的ACTIVEMQ服务器
Spring+JMS+ActiveMQ+Tomcat实现消息服务
Linux环境下面ActiveMQ端口号设置和WEB端口号设置
配置桥接的过程是相当简单的,我们需要做以下的事情:
1. 下载ActiveMQ资源适配器归档文件
2. 在WildFly 7中安装和配置资源适配器
3. 在WildFly 7内嵌的HornetQ实例中,创建一个本地JMS队列
4. 在本地队列和远程ActiveMQ队列之间,创建一个JMS桥接.
为了开始, 我下载了ActiveMQ资源适配器,从这个页面:
下一步,我们需要使用如下的命令,为activemq资源适配器,创建一个JBoss模块,:
mkdir modules/system/layers/base/org/activemq/main
cd modules/system/layers/base/org/activemq/main
unzip ~/activemq-rar-5.9.0.rar
这将会创建一个包含模块层次结构的目录,并将activemq资源适配器文件解压到此目录.JBoss只支持把拓展的资源适配器作为模块,所以我们解压归档文件的内容.同时,我们需要在activemq/main目录,创建一个包含如下内容的module.xml文件.这是为了让JBoss区分,哪些jar文件需要加装,哪些类不需要和其它模块共享(我们不希望和任何库的实现相冲突).
<module xmlns="urn:jboss:module:1.1" xmlns:xsi="">
<resources>
<resource-root path="."/>
<resource-root path="activemq-broker-5.9.0.jar"/>
<resource-root path="activemq-client-5.9.0.jar"/>
<resource-root path="activemq-jms-pool-5.9.0.jar"/>
<resource-root path="activemq-kahadb-store-5.9.0.jar"/>
<resource-root path="activemq-openwire-legacy-5.9.0.jar"/>
<resource-root path="activemq-pool-5.9.0.jar"/>
<resource-root path="activemq-protobuf-1.1.jar"/>
<resource-root path="activemq-ra-5.9.0.jar"/>
<resource-root path="activemq-spring-5.9.0.jar"/>
<resource-root path="aopalliance-1.0.jar"/>
<resource-root path="commons-pool-1.6.jar"/>
<resource-root path="commons-logging-1.1.3.jar"/>
<resource-root path="hawtbuf-1.9.jar"/>
<resource-root path="spring-aop-3.2.4.RELEASE.jar"/>
<resource-root path="spring-beans-3.2.4.RELEASE.jar"/>
<resource-root path="spring-context-3.2.4.RELEASE.jar"/>
<resource-root path="spring-core-3.2.4.RELEASE.jar"/>
<resource-root path="spring-expression-3.2.4.RELEASE.jar"/>
<resource-root path="xbean-spring-3.14.jar"/>
</resources>
<exports>
<exclude path="org/springframework/**"/>
<exclude path="org/apache/xbean/**"/>
<exclude path="org/apache/commons/**"/>
<exclude path="org/aopalliance/**"/>
<exclude path="org/fusesource/**"/>
</exports>
<dependencies>
<modulehttps://www.linuxidc.com/Java" target="_blank" title="https://www.linuxidc.com/topicnews.aspx?tid=19">Javax.api"/>
<module/>
<module/>
<module/>
<module/>
</dependencies>
</module>