从ActiveMQ Classic迁移至Artemis:对接外部WebSphere队列求助
解决Artemis对接WebSphere MQ的配置问题
首先明确核心问题:你把Spring的Bean配置放到Artemis的broker.xml里是没用的——broker.xml是Artemis的原生配置文件,根本不解析Spring的<bean>标签和Camel上下文,所以这些配置完全不会生效。
下面给两种可行的解决方案,根据你的需求选择:
方案一:保留Spring + Camel架构,适配Artemis
原来的Camel路由逻辑可以完全保留,只是把ActiveMQ Classic的连接组件换成Artemis的,整个配置还是放在Spring配置文件(比如applicationContext.xml)里,让Spring来加载,Artemis作为独立的消息 broker 运行。
修改后的Spring配置示例
<!-- Artemis 本地连接配置 --> <bean id="artemisConnectionFactory" class="org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory"> <!-- 替换成你的Artemis连接地址,默认tcp端口是61616 --> <property name="brokerURL" value="tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1" /> </bean> <bean id="artemisJmsConfig" class="org.apache.camel.component.jms.JmsConfiguration"> <property name="connectionFactory" ref="artemisConnectionFactory" /> <property name="concurrentConsumers" value="1" /> </bean> <!-- 把原ActiveMQComponent换成通用JmsComponent,兼容Artemis --> <bean id="activemq" class="org.apache.camel.component.jms.JmsComponent"> <property name="configuration" ref="artemisJmsConfig" /> </bean> <!-- 外部WebSphere MQ连接配置和原来完全一致,不用改 --> <bean id="usToThemConnectionFactory" class="com.ibm.mq.jms.MQConnectionFactory"> <property name="transportType" value="1" /> <property name="hostName" value="external.server.ip.address" /> <property name="port" value="1515" /> <property name="queueManager" value="DMZP" /> <property name="channel" value="RECL.SVRCONN" /> </bean> <bean id="usToThemConfig" class="org.apache.camel.component.jms.JmsConfiguration"> <property name="connectionFactory" ref="usToThemConnectionFactory" /> <property name="concurrentConsumers" value="1" /> </bean> <bean id="websphereOut" class="org.apache.camel.component.jms.JmsComponent"> <property name="configuration" ref="usToThemConfig" /> </bean> <!-- 补充原配置里缺失的websphereIn组件(和websphereOut配置一致,按需调整) --> <bean id="websphereInConnectionFactory" class="com.ibm.mq.jms.MQConnectionFactory"> <property name="transportType" value="1" /> <property name="hostName" value="external.server.ip.address" /> <property name="port" value="1515" /> <property name="queueManager" value="DMZP" /> <property name="channel" value="RECL.SVRCONN" /> </bean> <bean id="websphereInConfig" class="org.apache.camel.component.jms.JmsConfiguration"> <property name="connectionFactory" ref="websphereInConnectionFactory" /> <property name="concurrentConsumers" value="1" /> </bean> <bean id="websphereIn" class="org.apache.camel.component.jms.JmsComponent"> <property name="configuration" ref="websphereInConfig" /> </bean> <!-- Camel路由逻辑完全保留,不用改 --> <camelContext id="wmqToAmqContext" xmlns="http://camel.apache.org/schema/spring"> <!-- 从WebSphere MQ拉取消息到Artemis --> <route id="transactionReceiptBridge"> <from uri="websphereIn:queue:THEM.TRANS.RECEIPT.REXI.QL?mapJmsMessage=true" /> <convertBodyTo type="java.lang.String" /> <to uri="activemq:queue:US.TRANS.RECEIPT.REXI" /> </route> <!-- 从Artemis推送消息到WebSphere MQ --> <route id="returnBridge"> <from uri="activemq:queue:US.CORE.RETURN.PTRO" /> <to uri="websphereOut:queue:THEM.CORE.RETURN.PTRO?mapJmsMessage=true" /> </route> </camelContext>
依赖说明
确保你的项目依赖里包含这些:
<!-- Artemis JMS客户端,版本和你的Artemis服务器一致 --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>artemis-jms-client</artifactId> <version>2.x.x</version> </dependency> <!-- Camel JMS组件 --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jms</artifactId> <version>3.x.x</version> </dependency> <!-- WebSphere MQ客户端 --> <dependency> <groupId>com.ibm.mq</groupId> <artifactId>com.ibm.mq.allclient</artifactId> <version>9.x.x</version> </dependency>
方案二:用Artemis原生桥接替代Camel
如果只是简单的队列间消息转发,不需要复杂的Camel路由逻辑,可以直接用Artemis自带的桥接功能,完全在broker.xml里配置,不用依赖Spring和Camel。
配置步骤
- 把WebSphere MQ的客户端jar包(比如
com.ibm.mq.allclient.jar)放到Artemis的lib目录下,让Artemis能加载MQ的驱动类。 - 在
broker.xml的<core>节点里添加以下配置:
<core xmlns="urn:activemq:core"> <!-- 你的原有配置... --> <!-- 定义外部WebSphere MQ的连接参数 --> <external-connectors> <external-connector name="wmq-connector"> <factory-class>com.ibm.mq.jms.MQConnectionFactory</factory-class> <param key="transportType" value="1" /> <param key="hostName" value="external.server.ip.address" /> <param key="port" value="1515" /> <param key="queueManager" value="DMZP" /> <param key="channel" value="RECL.SVRCONN" /> </external-connector> </external-connectors> <!-- 配置消息桥接 --> <bridges> <!-- 入站桥接:从WebSphere MQ拉取到Artemis本地队列 --> <bridge name="mq-to-artemis-receipt-bridge"> <queue-name>US.TRANS.RECEIPT.REXI</queue-name> <!-- Artemis本地队列 --> <forwarding-address>THEM.TRANS.RECEIPT.REXI.QL</forwarding-address> <!-- MQ队列 --> <external-connector-ref>wmq-connector</external-connector-ref> <concurrent-consumers>1</concurrent-consumers> <transformer-class-name>org.apache.activemq.artemis.core.server.transformer.JMSMessageTransformer</transformer-class-name> </bridge> <!-- 出站桥接:从Artemis本地队列推送到WebSphere MQ --> <bridge name="artemis-to-mq-return-bridge"> <queue-name>US.CORE.RETURN.PTRO</queue-name> <!-- Artemis本地队列 --> <forwarding-address>THEM.CORE.RETURN.PTRO</forwarding-address> <!-- MQ队列 --> <external-connector-ref>wmq-connector</external-connector-ref> <concurrent-consumers>1</concurrent-consumers> <transformer-class-name>org.apache.activemq.artemis.core.server.transformer.JMSMessageTransformer</transformer-class-name> </bridge> </bridges> </core>
说明
external-connector相当于定义了连接到WebSphere MQ的连接工厂。- 每个
bridge对应一个单向的消息转发通道,<queue-name>是Artemis的本地队列,<forwarding-address>是外部MQ的队列名。 - 这种方式更轻量,不需要额外的Spring和Camel依赖,适合简单的消息同步场景。
内容的提问来源于stack exchange,提问作者ugh dad
相关产品推荐
相关产品推荐

