Apache camel 蓝图从配置文件读取值

Apache camel 蓝图从配置文件读取值,apache-camel,cxf,blueprint,Apache Camel,Cxf,Blueprint,我有一个Blueprint.xml,我需要从外部配置文件中读取值(在本例中,输入_from1的值): 。。。。 您正在寻找apache camel中的功能。ApacheCamel站点有很多关于使用它的信息,但是我将逐步介绍基本知识,这样您就可以用更多扩展的文档来填补空白。您也在使用blueprint,它不同于旧的Spring PlaceHolder。本质上,这是一种键值类型语法,需要注意一些问题 1。blueprint.xml中属性占位符的格式/语法: 属性的值可以通过使用以下语法/格式{{ke

我有一个Blueprint.xml,我需要从外部配置文件中读取值(在本例中,输入_from1的值):

。。。。
您正在寻找apache camel中的功能。ApacheCamel站点有很多关于使用它的信息,但是我将逐步介绍基本知识,这样您就可以用更多扩展的文档来填补空白。您也在使用blueprint,它不同于旧的Spring PlaceHolder。本质上,这是一种键值类型语法,需要注意一些问题

1。blueprint.xml中属性占位符的格式/语法:

属性的值可以通过使用以下语法/格式
{{key}}
在属性占位符中指定其键名来获得

例如,要指定服务器地址,可以使用
{{server.ip}

2。使用属性解析器:

可以将属性占位符的值存储在不同的位置,因此需要指定如何解析它们。这是通过使用PropertyResolver前缀完成的:

    Prefix       Description
    ref:         Lookup in the Registry.
    file:        Load the from file system.
    classpath:   Load from the classpath(default if no provider specified)
    blueprint:   Use a specific OSGi blueprint placeholder service.
3。将CM命名空间添加到blueprint.xml

更改蓝图XML以包含CM命名空间

因此,从:

 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
如果您的更新策略设置为重新加载,如我的示例所示,如果您更改了cfg文件的值,那么它将重新加载指向此配置的路由。动态属性无需停止和启动您的路线

现在,有时需要在系统中使用多个属性文件。例如,电子邮件属性文件和数据库属性文件

为此,您需要知道,您需要更改第二个、第三个etc文件的propertyplaceholder语法/格式

只有第一个属性文件可以使用
{{some.value}
。这需要在声明属性占位符时完成。请参见下面的示例:

<cm:property-placeholder id="UpdateFilesProperties" persistent-id="maintenance.files.cfg" update-strategy="reload">
    <cm:default-properties>
        <cm:property name="washPool.size" value="1"/>
        <cm:property name="sifPool.size" value="1"/>
        <cm:property name="updatePool.size" value="1"/>
        <cm:property name="etlJobPool.size" value="1"/>
        <cm:property name="etlSplitPool.size" value="1"/>
        com.au"/>
    </cm:default-properties>
</cm:property-placeholder>
<cm:property-placeholder id="ccompany.info" persistent-id="info"
    placeholder-prefix="$([" placeholder-suffix="])" update-strategy="reload">
    <cm:default-properties>
        <!--    properties  -->
    </cm:default-properties>
</cm:property-placeholder>

com.au“/>
因此,第一组属性将是类似于
{{{washPool.size}}
的访问,但是第二组属性将使用这些属性指定的语法
占位符前缀=“$([”placeholder suffix=“])”
因此
([key.value])


它们的功能非常强大。例如,我使用它们来配置路由上的线程数,这样我就可以根据反馈调整性能,而无需重新编译和重新部署。

您可以使用cm:property占位符

请查收 使用[1]中Blueprint属性占位符部分的.cfg或.properties文件

有一个选项更新策略,可以设置为重新加载,添加或覆盖的新属性将反映


[1]

谢谢你的回答。我正确的问题是,如果我在Apache Fuse中部署此应用程序,如何在fly中修改此属性。谢谢。@JoseVázquez你是说JBoss Fuse?JBoss Fuse是一个红帽认证的servicemix。它还使用Apache karaf。因此,在JBoss Fuse主路径中,你应该找到一个类似/opt/JBoss_Fuse/etc.Stor的etc目录将配置文件保存在那里。您可以打开这些文件,编辑并保存它们,Fuse将获取更改。
    <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
       xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd         http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd   http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">

<!-- NOTE: The system will look for a file called company.info.cfg in the classpath, this is the value specified by  persistent-id="company.info". -->

<cm:property-placeholder id="placeholder.company.info" persistent-id="company.info"  update-strategy="reload">
    <cm:default-properties>
        <cm:property name="company.division.name" value="Foobab"/>
        <cm:property name="company.division.mail.host" value="foobab-mail-1-server"/>
        <cm:property name="company.division.mail.to"   value="foo@bab.com"/>
        <cm:property name="company.division.mail.from" value="foobabCamelServer@bab.com"/>
    </cm:default-properties>
</cm:property-placeholder>

<camelContext id="rmsConfirmedClosedAccountContext" xmlns="http://camel.apache.org/schema/blueprint">
  <endpoint id="smtpFoobabReport" uri="smtp://{{company.division.mail.host}}?to={{company.division.mail.to}}&amp;from={{company.division.mail.from}}&amp;contentType=text/html"/><!-- Here we use a property placeholder For The Mail server-->
      
    <route id="timerHelloRoute">
        <from id="fromTimerFoobab" uri="timer:Foobab"/>
        <setHeader headerName="subject" id="setCompanySubjectHeader">
            <constant>Foobab reminder for:{{company.division.name}}</constant> <!-- Here we use a property placeholder to set the subject-->
        </setHeader>
        <setHeader headerName="body" id="setMailBOdy">
            <constant>The company needs to view its foobab report</constant> 
        </setHeader>
        <to id="toSmtpFoobabReport" ref="smtpFoobabReport"/>
</camelContext>
company.division.name = foobabababa
company.division.mail.host = production.mail
<cm:property-placeholder id="UpdateFilesProperties" persistent-id="maintenance.files.cfg" update-strategy="reload">
    <cm:default-properties>
        <cm:property name="washPool.size" value="1"/>
        <cm:property name="sifPool.size" value="1"/>
        <cm:property name="updatePool.size" value="1"/>
        <cm:property name="etlJobPool.size" value="1"/>
        <cm:property name="etlSplitPool.size" value="1"/>
        com.au"/>
    </cm:default-properties>
</cm:property-placeholder>
<cm:property-placeholder id="ccompany.info" persistent-id="info"
    placeholder-prefix="$([" placeholder-suffix="])" update-strategy="reload">
    <cm:default-properties>
        <!--    properties  -->
    </cm:default-properties>
</cm:property-placeholder>