2.7. 자산 위치 소유자
2.7.1. 개요
속성 자리 표시자 기능을 사용하여 문자열을 다양한 컨텍스트(예: XML DSL 요소의 끝점 URI 및 속성)로 대체할 수 있습니다. 자리 표시자 설정은 Java 속성 파일에 저장됩니다. 이 기능은 다양한 Apache Camel 애플리케이션 간에 설정을 공유하거나 특정 구성 설정을 중앙 집중화하려는 경우 유용할 수 있습니다.
예를 들어 다음 경로는 호스트와 포트가 자리 표시자인 {{remote.host}} 및
로 대체되는 웹 서버에 요청을 보냅니다.
{{remote.port}}
from("direct:start").to("http://{{remote.host}}:{{remote.port}}");
자리 표시자 값은 다음과 같이 Java 속성 파일에서 정의됩니다.
# Java properties file remote.host=myserver.com remote.port=8080
속성 위치 소유자는 UTF-8과 같은 특정 문자 세트를 사용하여 .properties
파일을 읽을 수 있는 인코딩 옵션을 지원합니다. 그러나 기본적으로 ISO-8859-1 문자 세트를 구현합니다.
PropertyPlaceholders
를 사용하는 Apache Camel은 다음을 지원합니다.
- 조회할 키와 함께 기본값을 지정합니다.
-
모든 자리 표시자 키가 사용할 기본값으로 구성된 경우
PropertiesComponent
를 정의할 필요가 없습니다. 타사 함수를 사용하여 속성 값을 조회합니다. 자체 논리를 구현할 수 있습니다.
참고OS 환경 변수, JVM 시스템 속성 또는 서비스 이름 idiom에서 값을 조회할 수 있는 상자 함수 3개를 제공합니다.
2.7.2. 속성 파일
속성 설정은 하나 이상의 Java 속성 파일에 저장되며 표준 Java 속성 파일 형식을 준수해야 합니다. 각 속성 설정은 Key=Value
형식으로 자체 줄에 표시됩니다. 비어 있지
않은 첫 번째 문자가 있는 줄은 주석으로 처리됩니다.
예를 들어, 속성 파일에는 예 2.4. “속성 파일 샘플” 에 표시된 대로 콘텐츠가 있을 수 있습니다.
예 2.4. 속성 파일 샘플
# Property placeholder settings # (in Java properties file format) cool.end=mock:result cool.result=result cool.concat=mock:{{cool.result}} cool.start=direct:cool cool.showid=true cheese.end=mock:cheese cheese.quote=Camel rocks cheese.type=Gouda bean.foo=foo bean.bar=bar
2.7.3. 속성 해결
속성 구성 요소는 경로 정의에서 사용하기 전에 하나 이상의 속성 파일의 위치로 구성해야 합니다. 다음 해결 방법 중 하나를 사용하여 속성 값을 제공해야 합니다.
classpath:PathName,PathName,…
- (default) classpath의 위치를 지정합니다. 여기서 PathName 은 슬래시를 사용하여 구분된 파일 경로 이름입니다.
파일:PathName,PathName,…
- 파일 시스템의 위치를 지정합니다. 여기서 PathName 은 슬래시를 사용하여 구분된 파일 경로 이름입니다.
ref: CryostatID
-
레지스트리에서
java.util.Properties
오브젝트의 ID를 지정합니다. 블루프린트: CryostatID
-
OSGi 구성 관리 서비스에 정의된 속성에 액세스하기 위해 OSGi 블루프린트 파일의 컨텍스트에서 사용되는
cm:property-placeholder
hieradata의 ID를 지정합니다. 자세한 내용은 “OSGi 블루프린트 속성 자리 표시자와 통합”의 내용을 참조하십시오.
예를 들어, classpath에 있는 com/fusesource/cheese.properties
속성 파일과 com/fusesource/bar.properties
속성 파일을 지정하려면 다음 위치 문자열을 사용합니다.
com/fusesource/cheese.properties,com/fusesource/bar.properties
classpath 확인자가 기본적으로 사용되므로 이 예제에서 classpath:
접두사를 생략할 수 있습니다.
2.7.4. 시스템 속성 및 환경 변수를 사용하여 위치 지정
Java 시스템 속성 및 O/S 환경 변수를 PathName 위치에 포함할 수 있습니다.
Java 시스템 속성은 ${PropertyName}
구문을 사용하여 위치 확인기에 포함될 수 있습니다. 예를 들어 Red Hat Fuse의 루트 디렉터리가 Java 시스템 속성인 karaf.home
에 저장된 경우 다음과 같이 파일 위치에 해당 디렉터리 값을 포함할 수 있습니다.
file:${karaf.home}/etc/foo.properties
O/S 환경 변수는 ${env:VarName}
구문을 사용하여 위치 확인기에 포함될 수 있습니다. 예를 들어, JBoss Fuse의 루트 디렉터리가 환경 변수 SMX_HOME
에 저장된 경우 다음과 같이 파일 위치에 해당 디렉터리 값을 포함할 수 있습니다.
file:${env:SMX_HOME}/etc/foo.properties
2.7.5. 속성 구성 요소 구성
속성 자리 표시자 사용을 시작하기 전에 하나 이상의 속성 파일의 위치를 지정하여 속성 구성 요소를 구성해야 합니다.Before you can start using property placeholders, you must configure the properties component, specifying the locations of one or more property files.
Java DSL에서는 다음과 같이 속성 파일 위치를 사용하여 속성 구성 요소를 구성할 수 있습니다.
// Java import org.apache.camel.component.properties.PropertiesComponent; ... PropertiesComponent pc = new PropertiesComponent(); pc.setLocation("com/fusesource/cheese.properties,com/fusesource/bar.properties"); context.addComponent("properties", pc);
addComponent()
호출에 표시된 것처럼 속성 구성 요소의 이름을 속성으로 설정해야 합니다.
XML DSL에서는 다음과 같이 전용 propertyPlacholder
요소를 사용하여 속성 구성 요소를 구성할 수 있습니다.
<camelContext ...> <propertyPlaceholder id="properties" location="com/fusesource/cheese.properties,com/fusesource/bar.properties" /> </camelContext>
속성 구성 요소가 초기화될 때 누락된 .properties
파일을 무시하도록 하려면 ignoreMissingLocation
옵션을 true
로 설정하면 일반적으로 누락된 .properties
파일이 오류가 발생합니다.
또한 속성 구성 요소가 Java 시스템 속성 또는 O/S 환경 변수를 사용하여 지정된 누락된 위치를 무시하도록 하려면 ignoreMissingLocation
옵션을 true
로 설정할 수 있습니다.
2.7.6. 자리 표시자 구문
속성 구성 요소를 구성한 후 적절한 컨텍스트에서 자리 표시자를 자동으로 대체합니다.After it is configured, the property component automatically substitutes placeholders (in the appropriate context). 자리 표시자의 구문은 다음과 같이 컨텍스트에 따라 달라집니다.
-
엔드 포인트 URI 및 Spring XML 파일에서 kafka -하겠습니다. 자리 표시자는
{{Key}}
로 지정됩니다. XML DSL 특성을 설정할 때 Cryostat-
xs:string
속성은 다음 구문을 사용하여 설정됩니다.AttributeName="{{Key}}"
다른 특성 유형(예:
xs:int
또는xs:boolean
)은 다음 구문을 사용하여 설정해야 합니다.prop:AttributeName="Key"
여기서
prop
은http://camel.apache.org/schema/placeholder
네임스페이스와 연결되어 있습니다.Java DSL EIP 옵션을 설정할 때 Java DSL에서 EIP(Enterprise Integration Pattern) 명령에 옵션을 설정하려면 fluent DSL에 다음과 같은
자리 표시자()
절을 추가합니다..placeholder("OptionName", "Key")
-
단순 언어 표현식에서 밀리초---- 자리 표시자는
${properties:Key}
로 지정됩니다.
2.7.7. 끝점 URI에서 대체
경로에 끝점 URI 문자열이 표시되는 경우 끝점 URI 구문 분석의 첫 번째 단계는 속성 자리 표시자 구문 분석기를 적용하는 것입니다. 자리 표시자 구문 분석기에서는 이중 중괄호, {{Key}}
사이에 나타나는 속성 이름을 자동으로 대체합니다. 예를 들어 예 2.4. “속성 파일 샘플” 에 표시된 속성 설정이 있는 경우 다음과 같이 경로를 정의할 수 있습니다.
from("{{cool.start}}") .to("log:{{cool.start}}?showBodyType=false&showExchangeId={{cool.showid}}") .to("mock:{{cool.result}}");
기본적으로 자리 표시자 구문 분석기에서는 레지스트리에서 속성
빈 ID를 조회하여 속성 구성 요소를 찾습니다. 원하는 경우 끝점 URI에서 스키마를 명시적으로 지정할 수 있습니다. 예를 들어 속성
앞에 각 끝점 URI를 접두사로 사용하면 다음과 같은 동등한 경로를 정의할 수 있습니다.
from("properties:{{cool.start}}") .to("properties:log:{{cool.start}}?showBodyType=false&showExchangeId={{cool.showid}}") .to("properties:mock:{{cool.result}}");
스키마를 명시적으로 지정할 때 속성 구성 요소에 대한 옵션을 지정하는 옵션도 있습니다. 예를 들어 속성 파일 위치를 재정의하려면 다음과 같이 위치
옵션을 설정할 수 있습니다.
from("direct:start").to("properties:{{bar.end}}?location=com/mycompany/bar.properties");
2.7.8. Spring XML 파일에서 대체
DSL 요소의 다양한 특성을 설정하기 위해 XML DSL에서 속성 자리 표시자를 사용할 수도 있습니다. 이 컨텍스트에서 placholder 구문은 이중 중괄호인 {{Key}}
를 사용합니다. 예를 들어 다음과 같이 속성 자리 표시자를 사용하여 jmxAgent
요소를 정의할 수 있습니다.
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> <propertyPlaceholder id="properties" location="org/apache/camel/spring/jmx.properties"/> <!-- we can use property placeholders when we define the JMX agent --> <jmxAgent id="agent" registryPort="{{myjmx.port}}" usePlatformMBeanServer="{{myjmx.usePlatform}}" createConnector="true" statisticsLevel="RoutesOnly" /> <route> <from uri="seda:start"/> <to uri="mock:result"/> </route> </camelContext>
2.7.9. XML DSL 특성 값 대체
예를 들어 < jmxAgent registryPort="{{myjmx.port}}" …> …
>와 같이 xs:string
유형의 속성 값을 지정하는 데 일반 자리 표시자 구문을 사용할 수 있습니다. 그러나 다른 유형의 속성(예: xs:int
또는 xs:boolean
)의 경우 특수 구문, prop:AttributeName="Key"
를 사용해야 합니다.
예를 들어 속성 파일에서 stop.flag
속성을 정의하는 경우 true
값을 가지면 이 속성을 사용하여 다음과 같이 stopOnException
부울 속성을 설정할 수 있습니다.
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:prop="http://camel.apache.org/schema/placeholder" ... > <bean id="illegal" class="java.lang.IllegalArgumentException"> <constructor-arg index="0" value="Good grief!"/> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring"> <propertyPlaceholder id="properties" location="classpath:org/apache/camel/component/properties/myprop.properties" xmlns="http://camel.apache.org/schema/spring"/> <route> <from uri="direct:start"/> <multicast prop:stopOnException="stop.flag"> <to uri="mock:a"/> <throwException ref="damn"/> <to uri="mock:b"/> </multicast> </route> </camelContext> </beans>
이전 예제의 빈
요소에 표시된 대로 prop
접두사를 Spring 파일의 http://camel.apache.org/schema/placeholder
네임스페이스에 명시적으로 할당해야 합니다.
2.7.10. Java DSL EIP 옵션 대체
Java DSL에서 EIP 명령을 호출할 때 자리 표시자 ("OptionName", "키") 형식의 하위 복제를 추가하여 속성 자리 표시자
의 값을 사용하여 EIP 옵션을 설정할 수 있습니다.
예를 들어 속성 파일에서 stop.flag
속성을 정의하는 경우 true
값을 가지면 이 속성을 사용하여 다음과 같이 멀티 캐스트 EIP의 stopOnException
옵션을 설정할 수 있습니다.
from("direct:start") .multicast().placeholder("stopOnException", "stop.flag") .to("mock:a").throwException(new IllegalAccessException("Damn")).to("mock:b");
2.7.11. 간단한 언어 표현식의 대체
간단한 언어 표현식에서 속성 자리 표시자를 대체할 수도 있지만, 이 경우 자리 표시자의 구문은 ${properties:Key}
입니다. 예를 들어 다음과 같이 Simple 표현식 내에서 cheese.quote
자리 표시자를 대체할 수 있습니다.
from("direct:start") .transform().simple("Hi ${body} do you think ${properties:cheese.quote}?");
구문 ${properties:Key:DefaultVal}
구문을 사용하여 속성의 기본값을 지정할 수 있습니다. 예를 들면 다음과 같습니다.
from("direct:start") .transform().simple("Hi ${body} do you think ${properties:cheese.quote:cheese is good}?");
${properties-location:Location:Key}
구문을 사용하여 속성 파일의 위치를 재정의할 수도 있습니다. 예를 들어 com/mycompany/bar.properties
속성 파일의 설정을 사용하여 bar.quote
자리 표시자를 대체하려면 다음과 같이 Simple 표현식을 정의할 수 있습니다.
from("direct:start") .transform().simple("Hi ${body}. ${properties-location:com/mycompany/bar.properties:bar.quote}.");
2.7.12. XML DSL에서 속성 위치 소유자 사용
이전 릴리스에서는 xs:string
유형 속성이 XML DSL의 자리 표시자를 지원하는 데 사용되었습니다. 예를 들어 timeout 속성은 xs:int
유형입니다. 따라서 문자열 값을 자리 표시자 키로 설정할 수 없습니다.
Apache Camel 2.7 이후부터는 이제 특수 자리 표시자 네임스페이스를 사용하면 됩니다. 다음 예제에서는 네임스페이스에 대한 prop 접두사를 보여줍니다. XML DSL의 특성에서 prop 접두사를 사용할 수 있습니다.
Multicast에서 stopOnException
옵션을 키가 stop
인 자리 표시자의 값으로 설정합니다. 또한 속성 파일에서 값을 로 정의합니다.
stop=true
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:prop="http://camel.apache.org/schema/placeholder" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd "> <!-- Notice in the declaration above, we have defined the prop prefix as the Camel placeholder namespace --> <bean id="damn" class="java.lang.IllegalArgumentException"> <constructor-arg index="0" value="Damn"/> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring"> <propertyPlaceholder id="properties" location="classpath:org/apache/camel/component/properties/myprop.properties" xmlns="http://camel.apache.org/schema/spring"/> <route> <from uri="direct:start"/> <!-- use prop namespace, to define a property placeholder, which maps to option stopOnException={{stop}} --> <multicast prop:stopOnException="stop"> <to uri="mock:a"/> <throwException ref="damn"/> <to uri="mock:b"/> </multicast> </route> </camelContext> </beans>
2.7.13. OSGi 블루프린트 속성 자리 표시자와 통합
Red Hat Fuse OSGi 컨테이너에 경로를 배포하는 경우 Apache Camel 속성 자리 표시자 메커니즘을 JBoss Fuse의 블루프린트 속성 자리 표시자 메커니즘과 통합할 수 있습니다(실제로 통합은 기본적으로 활성화됨). 다음과 같이 통합을 설정하는 두 가지 기본 방법이 있습니다.
2.7.14. 암시적 블루프린트 통합
OSGi 블루프린트 파일 내에 camelContext
요소를 정의하면 Apache Camel 속성 자리 표시자 메커니즘이 블루프린트 속성 자리 표시자 메커니즘과 자동으로 통합됩니다. 즉, camelContext
범위 내에 표시되는 Apache Camel 구문(예: {{cool.end}}
)을 따르는 자리 표시자는 블루프린트 속성 자리 표시자 메커니즘을 확인하여 암시적으로 해결됩니다.
예를 들어, 경로의 마지막 끝점이 속성 자리 표시자인 {{result}}
:에 의해 정의된 OSGi 블루프린트 파일에 다음 경로를 고려하십시오.
<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"> <!-- OSGI blueprint property placeholder --> <cm:property-placeholder id="myblueprint.placeholder" persistent-id="camel.blueprint"> <!-- list some properties for this test --> <cm:default-properties> <cm:property name="result" value="mock:result"/> </cm:default-properties> </cm:property-placeholder> <camelContext xmlns="http://camel.apache.org/schema/blueprint"> <!-- in the route we can use {{ }} placeholders which will look up in blueprint, as Camel will auto detect the OSGi blueprint property placeholder and use it --> <route> <from uri="direct:start"/> <to uri="mock:foo"/> <to uri="{{result}}"/> </route> </camelContext> </blueprint>
블루프린트 속성 자리 표시자 메커니즘은 cm:property-placeholder
hieradata를 생성하여 초기화됩니다. 이전 예에서 cm:property-placeholder
hieradata는 camel.blueprint
영구 ID와 연결되어 있습니다. 여기서 영구 ID는 OSGi 구성 관리자 서비스의 관련 속성 그룹을 참조하는 표준 방법입니다. 즉, cm:property-placeholder
hieradata는 camel.blueprint
영구 ID 아래에 정의된 모든 속성에 대한 액세스를 제공합니다. 또한 일부 속성( nested cm:property
요소 사용)에 기본값을 지정할 수도 있습니다.
블루프린트 컨텍스트에서 Apache Camel 자리 표시자 메커니즘은 8080 레지스트리에서 cm:property-placeholder
인스턴스를 검색합니다. 이러한 인스턴스를 찾으면 Apache Camel 자리 표시자 메커니즘을 자동으로 통합하여, {{result}}
와 같은 자리 표시자 메커니즘은 블루프린트 속성 자리 표시자 메커니즘에서 키를 조회하여 해결됩니다(이 예에서는 myblueprint.placeholder
chain을 통해).
기본 블루프린트 자리 표시자 구문( 블루프린트 속성 액세스)은 ${Key}
입니다. 따라서 camelContext
요소의 범위를 벗어나는 자리 표시자 구문은 ${Key}
입니다. 반면 camel Context
요소의 범위 내에서 사용해야 하는 자리 표시자 구문은 {{Key}}
입니다.
2.7.15. 명시적 블루프린트 통합
Apache Camel 속성 자리 표시자 메커니즘에서 해당 속성을 찾는 위치를 더 많이 제어하려면 propertyPlaceholder
요소를 정의하고 확인자 위치를 명시적으로 지정할 수 있습니다.
예를 들어 명시적 propertyPlaceholder
인스턴스를 생성한다는 점에서 이전 예제와 다른 다음 블루프린트 구성을 고려하십시오.
<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"> <!-- OSGI blueprint property placeholder --> <cm:property-placeholder id="myblueprint.placeholder" persistent-id="camel.blueprint"> <!-- list some properties for this test --> <cm:default-properties> <cm:property name="result" value="mock:result"/> </cm:default-properties> </cm:property-placeholder> <camelContext xmlns="http://camel.apache.org/schema/blueprint"> <!-- using Camel properties component and refer to the blueprint property placeholder by its id --> <propertyPlaceholder id="properties" location="blueprint:myblueprint.placeholder"/> <!-- in the route we can use {{ }} placeholders which will lookup in blueprint --> <route> <from uri="direct:start"/> <to uri="mock:foo"/> <to uri="{{result}}"/> </route> </camelContext> </blueprint>
이전 예에서 propertyPlaceholder
요소는 위치를 블루프린트:myblueprint.placeholder 로 설정하여 사용할
hieradata를 명시적으로 지정합니다. 즉, cm:property-placeholder
블루프린트:
resolver는 cm:property-placeholder
hieradata의 ID, myblueprint.placeholder
임을 명시적으로 참조합니다.
이 구성 스타일은 블루프린트 파일에 정의된 cm:property-placeholder
hieradata가 두 개 이상 있고 사용할 구성을 지정해야 하는 경우 유용합니다. 또한 쉼표로 구분된 위치 목록을 지정하여 여러 위치에서 속성을 소스할 수 있습니다. 예를 들어 cm:property-placeholder
hieradata와 속성 파일 myproperties.properties
에서 속성을 조회하려면 classpath에서 propertyPlaceholder
요소를 다음과 같이 정의할 수 있습니다.
<propertyPlaceholder id="properties" location="blueprint:myblueprint.placeholder,classpath:myproperties.properties"/>
2.7.16. Spring 속성 자리 표시자와 통합
Spring XML 파일에서 XML DSL을 사용하여 Apache Camel 애플리케이션을 정의하는 경우 org.apache.camel.spring.spi.BridgePropertyPlaceConfigurer
유형의 Spring 메가바이트를 선언하여 Apache Camel 속성 자리 표시자 메커니즘을 Spring 속성 자리 표시자 메커니즘과 통합할 수 있습니다.
Apache Camel의 property
Placeholder를 정의합니다. 그런 다음 Spring Placeholder
element 및 Spring's ctx:property-placeholder
요소를 Spring XML 파일에서 모두 대체하는 BridgeProperty${PropName} 구문 또는 Apache Camel
구문을 사용하여 구성된 속성을 참조할 수 있습니다.
{{PropName
}}
예를 들어 cheese.properties
파일에서 속성 설정을 읽는 브리지 속성 자리 표시자를 정의합니다.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ctx="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- Bridge Spring property placeholder with Camel --> <!-- Do not use <ctx:property-placeholder ... > at the same time --> <bean id="bridgePropertyPlaceholder" class="org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer"> <property name="location" value="classpath:org/apache/camel/component/properties/cheese.properties"/> </bean> <!-- A bean that uses Spring property placeholder --> <!-- The ${hi} is a spring property placeholder --> <bean id="hello" class="org.apache.camel.component.properties.HelloBean"> <property name="greeting" value="${hi}"/> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring"> <!-- Use Camel's property placeholder {{ }} style --> <route> <from uri="direct:{{cool.bar}}"/> <bean ref="hello"/> <to uri="{{cool.end}}"/> </route> </camelContext> </beans>
또는 BridgePropertyPlaceholderConfigurer
의 location
속성을 Spring 속성 파일을 가리키도록 설정할 수 있습니다. Spring 속성 파일 구문이 완전히 지원됩니다.