ActiveMQ嵌入式桥到Camel JMS桥

问题描述

我有一个旧应用程序,该应用程序使用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状态。底线-谨防琐碎的骆驼路线。