【问题标题】:ActiveMQ embedded bridge to Camel JMS bridgeActiveMQ 嵌入式桥接 Camel JMS 桥接
【发布时间】:2021-01-14 10:04:41
【问题描述】:

我有一个旧应用程序,它使用 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 配置文件的简单方法是什么?

【问题讨论】:

    标签: apache-camel jms activemq jndi camel-jms


    【解决方案1】:

    正如the documentation for the JMS to JMS Bridge(即org.apache.activemq.network.jms.JmsConnector)所说:

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

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

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

    警告,先试试 Camel!

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

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

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

    【讨论】:

    • 感谢您的回答,是的,我也在文档中看到了这一点。事实上,我是 JMS 的一个巨大的初学者,我希望找到一个比使用骆驼更简单的解决方案。从查看我的实际配置开始,您对我有什么线索吗?我不知道从哪里开始...谢谢
    • 引用的文档有一个简单的骆驼示例。还有Camel documentation。对于它的价值,通常认为获得问题的答案然后更改问题以使先前的答案基本上无效是不好的形式。通常,您只需将答案标记为正确(假设正确),然后创建一个新问题。 cmets 中的简短后续问题当然很好,但您现在真的在问一个完全不同的问题。我建议你创建一个新的。
    • 如果您正在寻找完整的 JMS 桥接示例,请查看这些 examples
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多