2017-06-21 103 views
1

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

.... 

<camelContext id="cbr-example-context" xmlns="http://camel.apache.org/schema/blueprint"> 

     <route id="cbr-route"> 

      <from id="_from1" uri="ftp://[email protected]:21/files?password=pass"/> 


      <to id="_to1" uri="file:c:/TestFTP"/> 

     </route> 
    </camelContext> 
</blueprint> 

回答

3

您正在寻找property place holder apache骆驼功能。 apache骆驼网站有很多关于使用这些信息的信息,但是我只是逐步介绍基础知识,以便您可以用更多扩展的文档填补空白。你也在使用与旧的春天的地方持有者不同的蓝图。从本质上讲,这是一个关键的值类型语法,需要注意一些问题。

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"> 

要:

<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"> 

一些例子和说明:

下面的例子声明了三个属性占位即邮件服务器名称,邮件和邮件属性。有些事情要注意的是,我没有使用属性解析器来声明它,因此它会在类路径中查找它。我将大部分路线部署在karaf上,因此我创建了一个company.info.cfg文件,放在我的karaf/etc文件夹中。让我们看看下面的蓝图,看看事情是如何结合的。阅读XML评论。

<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="[email protected]"/> 
     <cm:property name="company.division.mail.from" value="[email protected]"/> 
    </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> 

你也注意到,我已经提供了使用默认值的属性占位符。这在开发过程中甚至在上线期间非常有用,因为骆驼会尝试查找属性文件,如果它不能,那么它将使用默认值,因此您可以将默认值指向开发并将配置文件中的生产值保持较远从开发盒。

更复杂的示例之前的最后一件事是文件和update_strategy标记。一个典型的配置文件会包含值如下:

company.division.name = foobabababa 
company.division.mail.host = production.mail 

如果您update_strategy设置为重新加载像我举的例子,如果你改变了CFG文件的值,那么它会重新加载其指向该配置的路由。动态属性不需要停止和开始你的路线。

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

为此,您需要知道您需要更改第二,第三等文件的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> 

所以第一组属性将会像{{washPool.size}}然而所述第二组属性的将使用由这些属性placeholder-prefix="$([" placeholder-suffix="])"从而([key.value])指定的语法的访问。

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

+0

比你的答复。 我正确的问题是,如果我在Apache Fuse中部署此应用程序,如何修改此属性。 谢谢。 –

+0

@JoseVázquez你的意思是JBoss Fuse? JBoss Fuse是一个红帽认证的servicemix。它也使用Apache karaf。所以在你的JBOSS Fuse主路径中,你应该找到一个etc目录,就像/ opt/jboss_fuse/etc。将配置文件存储在那里。您可以打开这些文件进行编辑并保存,Fuse将提取这些更改。 – Namphibian