0

我有一个旧应用程序,它处理带有 ActiveMQ 5.8.0 的 JMS 消息和一些连接到这个 ActiveMQ 的 JNDI 远程主题。

我有一个这样的连接器:

<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 嵌入式桥接器。但是我找不到任何可以用来替换我实际的两个 bean JMSConnector 的 XML 配置示例。保留我的 XML 配置文件的简单方法是什么?

4

2 回答 2

0

我认为让您的代码返回 aTopicConnectionFactory将是最简单的解决方案。甚至 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”端点关闭,则此路由将从“from”端点读取,并将消息扔到地板上。此外,如果“to”组件未配置为使用缓存/池连接工厂,则将为每个发送的消息创建一个新的 JMS 连接。这性能很差,并且可能导致许多套接字处于 TIME_WAIT 状态。底线 - 当心琐碎的骆驼路线。

于 2020-09-29T14:26:47.903 回答
0

正如JMS 到 JMS 桥(即org.apache.activemq.network.jms.JmsConnector)的文档所述:

ActiveMQ 为实现JMS 1.0.2及以上规范的其他 JMS 提供者提供了桥接功能。

换句话说,JMS 到 JMS 桥的全部目标是使用 JMS 1.0.2 接口。将其更改为仅使用 JMS 1.1 会破坏目的。

该文档还指出,您应该使用 Camel 而不是 JMS 到 JMS 桥:

警告,先试试骆驼!

请注意,我们建议您考虑使用 Apache Camel 将 ActiveMQ 桥接到任何消息代理(或实际上任何其他技术、协议或中间件),因为它更容易:

  • 保持灵活;将不同的队列/主题映射到另一个提供者上的一个或多个队列或主题非常容易
  • 执行基于内容的路由、过滤和其他企业集成模式
  • 允许您使用任何技术、协议或中间件,而不仅仅是 JMS 提供程序

因此,我建议您使用 Camel 而不是org.apache.activemq.network.jms.JmsConnector.

于 2020-09-29T02:14:39.817 回答