如何在 Apache Camel 中使用 SimpleRegistry 的属性 (Spring XML)

How to use properties with the SimpleRegistry in Apache Camel (Spring XML)

我想使用 SimpleRegistry 来存储属性(作为全局变量)。 属性 在具有 jms 端点的路由中更改为 setProperty。骆驼文件上周发生了变化,有很多死链接,还有注册表页面。我没有找到任何描述 simpleRegistry 使用的示例。

我使用 camel-example-servlet-tomcat 作为基础。我不使用 Fuse 或补丁的 camel wildfly,因为对于我们的简单模块来说太大了。

<beans .... >
   .
   .
   .
  <bean id="simpleRegistry" class="org.apache.camel.support.SimpleRegistry" />

  <camelContext xmlns="http://camel.apache.org/schema/spring">
    <propertyPlaceholder id="properties" location="ref:simpleRegistry" />
    <route id="storeConfig">
      <from id="myTopic" uri="jms:topic:myTopic?selector=Configuration %3D 'xyz'" />
      <log id="printHeader2" message="Received header: ${headers}" />
      <log id="logToken" message="Received token: ${headers[myToken]}" />
      <setProperty id="setMyToken" name="myProperty">
        <simple>${headers[myToken]}</simple>
      </setProperty>
    </route>
    <route id="externalIncomingDataRoute">
      <from uri="servlet:hello" />
      <transform>
            <simple>The Token is: {{myProperty}}</simple>
      </transform>
    </route>
  </camelContext>
</beans>

像上面那样定义了 camel 上下文,我得到了 java.io.FileNotFoundException Properties simpleRegistry not found in registry.

当我使用 <propertyPlaceholder id="properties" location="classpath:test.properties" /> 并创建一个 test.properties 文件时,一切正常,但我无法更改 属性。 setProperty标签中的操作被忽略。

我需要全局变量的原因是,我通过 jms 主题将动态配置(myToken)发送到 camel 上下文。单个路由应全局存储此配置。如果通过rest组件调用其他路由,则此路由需要token进行选择。

好的,你的问题涉及多个主题。

  1. 你写道你想使用 Camel SimpleRegistry,但你显然有一个 Spring 应用程序。

如果 Spring 可用,Camel 注册表会自动使用 Spring bean 注册表Camel Registry is just a thin wrapper 或使用 尽可能使用另一个框架的可用注册表的提供程序接口

Camel SimpleRegistry 仅在没有其他可用的情况下使用。这基本上是一个基于 Map 的内存中注册表。

  1. 您想要设置 属性 与 <setProperty> 的应用程序。

<setProperty> 设置 Exchange 属性,而不是应用程序 属性。有了这个,您可以将值保存在 Exchange of a message 中。

  1. 您想使用 "global variables"。

您也许可以使用作为 Map 的 Spring 单例 bean。然后你可以在你需要的地方自动装配它,它就像一个应用程序范围内可用的地图。

但是,请三思为什么需要这种变量。这也可能是设计问题的症状。

或者,您可以按照以下使用 PropertiesComponent 的方法获得相同的结果

<bean id="applicationProperties" class="java.util.Properties"/>

<bean id="properties" class="org.apache.camel.component.properties.PropertiesComponent">
    <property name="location" value="classpath:application.properties"/>
    <property name="overrideProperties" ref="applicationProperties" />
</bean> 

在 camel 上下文中定义 属性 占位符:

<propertyPlaceholder id="propertiesRef" location="ref:applicationProperties" />

设置一个属性如下图:

<bean ref="applicationProperties" method="setProperty(token, 'Test'})" />

并获取 属性 :${properties:token}