在Camel Context之外加载环境变量

时间:2017-08-17 12:55:26

标签: apache-camel environment-variables blueprint-osgi

我正在使用Camel和blueprint xml。当我设置我的bean时,我想访问Camel Context之外的环境变量。最初我创建了一个环境变量(我正在使用Windows)

set TEST=test_value

我的蓝图xml就像这样

<?xml version="1.0" encoding="UTF-8"?>

<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"
    xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
    xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf">

    <cm:property-placeholder persistent-id="configuration.file"/>
    ...
    ...
    <bean id="_test" class="com.xxx.Test">
        <argument value="${my.property}"/>
    </bean>
    ...
    <camelContext id="_camelContext"
        xmlns="http://camel.apache.org/schema/blueprint"/>
    ...
    <!-- I can access environment variable with the following 2 ways -->
    <log message="TEST = {{env:TEST}}"/>     
    <log message="TEST via cfg file = {{my.property}}"/>
    ...
    </camelContext> 

和我配置文件(在etc文件夹下) configuration.file.cfg

my.property=${env.TEST}

使用上一种方法,我可以访问bean中的环境变量(外部上下文)。我怎么能直接这样做?不使用属性文件?

我尝试了以下

<bean id="_test" class="com.xxx.Test">
   <argument value="${env:TEST}"/>
</bean>

但是没有用。

谢谢!

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

最后我找到了办法。我正在使用 fabric8-karaf-blueprint ,它利用来自fabric8-karaf-core的Aries PropertyEvaluator和属性占位符解析器,让您解决Blueprint XML文件中的占位符。

首先在pom.xml中添加该功能。

<select data-bind="isolatedOptions: $root.procurementTypes, optionsText: 'Display', optionsValue: 'ItemValue', optionsCaption: 'Select...', value: $data.PROCURE_TY, visible:$root.s1display([6,1])() === 2 && $root.workflowStepDescription().statusCode !== 'NIP'"></select>

接下来,在blueprint.xml中添加名称空间 blueprint-ext 。定义不同的前缀和sufix(例如$ []),所以不要与现有的blueprint-cm混淆。最后使用语法 $ [env:TEST] 访问环境变量。接下来是蓝图样本。

<startupFeatures>
  ...
  <feature>fabric8-karaf-blueprint</feature>
  ...
</startupFeatures>