我有一个Blueprint.xml,我需要从外部配置文件读取值(在本例中是要放入_from1的值):
....
<camelContext id="cbr-example-context" xmlns="http://camel.apache.org/schema/blueprint">
<route id="cbr-route">
<from id="_from1" uri="ftp://user@localhost:21/files?password=pass"/>
<to id="_to1" uri="file:c:/TestFTP"/>
</route>
</camelContext>
</blueprint>
答案 0 :(得分:3)
您正在寻找apache camel中的property place holder功能。 apache camel网站有很多关于使用它的信息,但是我将逐步介绍基础知识,以便您可以填充更多扩展文档的空白。您还使用与旧的Spring占位符不同的蓝图。基本上这是一个键值类型语法,需要注意一些问题。
<强> 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,servicemix上部署了大部分路由,因此我创建了一个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="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}}&from={{company.division.mail.from}}&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>
您还会注意到我已经为属性占位符提供了默认值。这在开发期间甚至在上线期间非常有用,因为camel将尝试查找属性文件,如果它不能,那么它将使用默认值,因此您可以将默认值指向开发并将配置文件中的生产值保持在远处来自开发盒。
更复杂的示例之前的最后一件事是文件和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])
。
他们非常强大。我使用它们来配置路由上的线程数,例如,这允许我根据反馈调整性能,而无需重新编译和重新部署。
答案 1 :(得分:0)
您可以使用cm:property-placeholder。
请检查 在[1]
中使用.cfg或.properties文件用于Blueprint Property Placeholders部分有一个选项更新策略,可以设置为重新加载,添加或覆盖的新属性将反映。