0

我有一个简单的 Camel 应用程序包,它将部署在 Apache Service Mix 6.1 下的 Karaf 3.0.5 中。配置文件放在etc/目录中(假设它被命名为wf.cfg)。我想在我的应用程序包中拥有动态配置更改功能。因此,无论何时更改某些内容,wf.cfg它都可以立即用于捆绑。为此,我在我的 blueprint.xml

<cm:property-placeholder persistent-id="wf"
    update-strategy="reload">
    <cm:default-properties>
        <cm:property name="env" value="local" />
    </cm:default-properties>
</cm:property-placeholder>

<!-- a bean that uses a blueprint property placeholder -->
<bean id="configBean" class="com.jabong.orchestratorservice.basecomponent.config.ConfigBean">
        <property name="env" value="${env}" />
</bean>

我现在面临的问题是如果update-strategy设置为reload. 然后它似乎正在重新加载整个bean。

有人可以告诉我有没有办法只重新加载而configBean不是整个捆绑包?如果我能做到这一点,那么我是否可以对其中的配置变量有一些静态引用,configBean然后我的应用程序包可以使用这些变量?

完整blueprint.xml的放在这里

4

1 回答 1

5

可以有property-placeholder两个值update-strategy

  1. reload:当属性更改时,蓝图容器会异步重新加载。任何属性更改都会停止上下文(并关闭骆驼),并使用新属性重新启动它。一切都是自动完成的。
  2. none:什么都没做。上下文未关闭(因此骆驼),但未注入属性。财产变更丢失

在 Aries-Blueprint 中还有另一种注入属性的方法,通过managed-properties:它们装饰 bean 定义,并在配置更改时动态地将新属性注入 bean。这里有两种模式:(bean-managed当配置改变时调用方法)和container-managed(当属性改变时调用setter)。

有了这个managed-properties,您可以动态拦截配置中的更改并对其做出响应,而无需重新启动蓝图上下文(因此无需停止骆驼上下文)。

但是,camel 中的组件并不是那么动态:它们在创建端点时读取配置,仅此而已。如果要动态更改路由的配置,这并不容易或不可能。您将不得不停止/启动路线。

于 2016-03-02T16:48:55.453 回答