问题描述
我有一个旧应用程序,该应用程序使用ActiveMQ 5.8.0处理JMS消息,并将一些JNDI远程主题连接到此ActiveMQ。
<bean class="org.apache.activemq.network.jms.JmsConnector">
<property name="outboundTopicConnectionFactory" ref="jmsConnectionFactoryTo" />
<property name="outboundClientId" value="${remote.clientId}" />
<property name="jndioutboundTemplate" ref="jndiTemplateto" />
<property name="preferJndiDestinationLookup" value="true" />
<property name="inboundTopicBridges">
<list>
<bean class="org.apache.activemq.network.jms.InboundTopicBridge">
<property name="inboundTopicName" value="${remote.topic.to}"/>
<property name="localTopicName" value="${local.topic.to}"/>
<property name="consumerName" value="${remote.consumer.name}"/>
<property name="selector" value="${remote.selector}"/>
</bean>
</list>
</property>
</bean>
它很好用,但是由于某些技术原因(严格的JMS 1.1),我现在需要使用“ ConnectionFactory”而不是“ TopicConnectionFactory”。 在实际配置中,我陷入了困境,因为ActiveMQ似乎使用“ TopicConnectionFactory”而不是“ ConnectionFactory”,而我的新类“ MyConnectionFactoryImpl”现在实现了“ ConnectionFactory”:
nested exception is org.springframework.beans.ConversionNotSupportedException:
Failed to convert property value of type 'com.webmethods.jms.impl.MyConnectionFactoryImpl'
to required type 'javax.jms.TopicConnectionFactory'
for property 'outboundTopicConnectionFactory';
nested exception is java.lang.IllegalStateException:
Cannot convert value of type [com.webmethods.jms.impl.MyConnectionFactoryImpl]
to required type [javax.jms.TopicConnectionFactory] for property 'outboundTopicConnectionFactory':
no matching editors or conversion strategy found
在“ org.apache.activemq.network.jms.JmsConnector”类中,它在各处使用“ TopicConnectionFactory”,在JMS 1.1中不再建议使用。
编辑: 根据@Justin Bertram的说法,我需要使用Camel而不是ActiveMQ嵌入式网桥。但是我找不到任何可用来代替实际的两个JMSConnector的XML配置示例。保留我的XML配置文件的最简单方法是什么?
解决方法
如the documentation for the JMS to JMS Bridge(即org.apache.activemq.network.jms.JmsConnector
)所述:
ActiveMQ向实现 JMS 1.0.2 及以上规范的其他JMS提供程序提供桥接功能。
换句话说,从JMS到JMS Bridge的整个目标是使用JMS 1.0.2接口。对其进行更改以使其仅使用JMS 1.1将会达到目的。
文档还指出,您应该使用Camel而不是JMS to JMS Bridge:
警告,请先尝试骆驼!
请注意,我们建议您使用Apache Camel将ActiveMQ与任何消息代理(或其他任何技术,协议或中间件)进行桥接,因为它更容易实现:
- 保持灵活;将不同的队列/主题映射到另一提供商上的一个或多个队列或主题非常容易
- 执行基于内容的路由,过滤和其他企业集成模式
- 允许您使用任何技术,协议或中间件,而不仅仅是JMS提供程序
因此,我建议您使用骆驼而不是org.apache.activemq.network.jms.JmsConnector
。
我认为让您的代码返回TopicConnectionFactory
是最简单的解决方案。甚至JMS 2.0规范都提供了TopicConnectionFactory
。无论使用什么版本的ActiveMQ,您都可以选择在代码中使用TopicConnectionFactory
并将其提供给网桥。
请注意,骆驼路线:
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="mqseries:Foo.Bar"/>
<to uri="activemq:Cheese"/>
</route>
</camelContext>
没有错误处理。例如,如果“到”端点关闭,则此路由将从“来自”端点读取,并将消息仅丢在地板上。此外,如果未将“ to”组件配置为使用缓存/池连接工厂,则将为每个发送的消息创建一个新的JMS连接。这会降低性能,并可能导致许多套接字处于TIME_WAIT状态。底线-谨防琐碎的骆驼路线。