13.2. Expression Language를 사용하는 방법

13.2.1. 사전 요구 사항

특정 표현식 언어를 사용하려면 먼저 클래스 경로에서 필요한 JAR 파일을 사용할 수 있는지 확인해야 합니다. 사용하려는 언어가 Apache Camel 코어에 포함되어 있지 않은 경우 해당 JAR을 클래스 경로에 추가해야 합니다.

Maven 빌드 시스템을 사용하는 경우 POM 파일에 관련 종속성을 추가하여 build-time classpath를 수정할 수 있습니다. 예를 들어 Ruby 언어를 사용하려면 POM 파일에 다음 종속성을 추가합니다.

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-groovy</artifactId>
  <!-- Use the same version as your Camel core version -->
  <version>${camel.version}</version>
</dependency>

Red Hat Fuse OSGi 컨테이너에 애플리케이션을 배포하려면 관련 언어 기능이 설치되어 있는지 확인해야 합니다(해당 Maven 아티팩트 뒤에 기능 이름이 지정됨). 예를 들어 OSGi 컨테이너에서 Groovy 언어를 사용하려면 먼저 다음 OSGi console 명령을 입력하여 camel-groovy 기능을 설치해야 합니다.

karaf@root> features:install camel-groovy
참고

경로에서 표현식 또는 서술자를 사용하는 경우 resource:classpath:path 또는 resource:file:path 를 사용하여 값을 외부 리소스로 참조합니다. 예를 들어 resource:classpath:com/foo/myscript.groovy.

13.2.2. Camel on EAP 배포

camel-groovy 구성 요소는 Red Hat JBoss EAP(JBoss Enterprise Application Platform) 컨테이너에 단순화된 배포 모델을 제공하는 EAP의 Camel(Wildfly Camel) 프레임워크에서 지원합니다.

13.2.3. 호출 방법

표 13.1. “표현 및 사전 언어” 에 표시된 대로 사용되는 컨텍스트에 따라 표현식 언어를 호출하는 데 사용되는 여러 가지 구문이 있습니다. 표현식 언어를 호출할 수 있습니다.

13.2.4. 정적 메서드로

대부분의 언어는 org.apache.camel.Expression 유형 또는 org.apache.camel.Predicate 유형이 예상되는 모든 컨텍스트에서 사용할 수 있는 정적 메서드를 정의합니다. 정적 메서드는 문자열 식(또는 조건자)을 인수로 사용하고 Expression 개체(일반적으로 Predicate 오브젝트)를 반환합니다.

예를 들어 XML 형식으로 메시지를 처리하는 콘텐츠 기반 라우터를 구현하려면 다음과 같이 /order/address/countryCode 요소의 값을 기반으로 메시지를 라우팅할 수 있습니다.

from("SourceURL")
  .choice
    .when(xpath("/order/address/countryCode = 'us'"))
      .to("file://countries/us/")
    .when(xpath("/order/address/countryCode = 'uk'"))
      .to("file://countries/uk/")
    .otherwise()
      .to("file://countries/other/")
  .to("TargetURL");

13.2.5. 유창한 DSL 방법

Java fluent DSL은 표현식 언어를 호출하는 다른 스타일을 지원합니다. EIP(Enterprise Integration Pattern)에 대한 인수로 표현식을 제공하는 대신 DSL 명령의 하위 규칙으로 표현식을 제공할 수 있습니다. 예를 들어, Cryostat 표현식을 filter(xpath("Expression") 로 호출하는 대신, filter().xpath("Expression") 로 표현식을 호출할 수 있습니다.

예를 들어 이전 콘텐츠 기반 라우터는 다음과 같이 이 호출 스타일로 다시 구현할 수 있습니다.

from("SourceURL")
  .choice
    .when().xpath("/order/address/countryCode = 'us'")
      .to("file://countries/us/")
    .when().xpath("/order/address/countryCode = 'uk'")
      .to("file://countries/uk/")
    .otherwise()
      .to("file://countries/other/")
  .to("TargetURL");

13.2.6. XML 요소

관련 XML 요소 내에 식 문자열을 배치하여 XML로 표현식 언어를 호출할 수도 있습니다.

예를 들어 XML에서 Cryostat를 호출하는 XML 요소는 (표준 Apache Camel 네임스페이스에 속하는) xpath 입니다. 다음과 같이 XML DSL 콘텐츠 기반 라우터에서 Cryostat 식을 사용할 수 있습니다.

<from uri="file://input/orders"/>
<choice>
  <when>
    <xpath>/order/address/countryCode = 'us'</xpath>
    <to uri="file://countries/us/"/>
  </when>
  <when>
    <xpath>/order/address/countryCode = 'uk'</xpath>
    <to uri="file://countries/uk/"/>
  </when>
  <otherwise>
    <to uri="file://countries/other/"/>
  </otherwise>
</choice>

또는 언어 특성에서 언어 이름을 지정하는 language 요소를 사용하여 언어 식을 지정할 수 있습니다.Alternatively, you can specify a language expression using the language element, where you specify the name of the language in the language attribute. 예를 들어 language 요소를 사용하여 다음과 같이 Cryostat 식을 정의할 수 있습니다.For example, you can define an Cryostat expression using the language element as follows:

<language language="xpath">/order/address/countryCode = 'us'</language>

13.2.7. 주석으로

언어 주석은 8080 통합 컨텍스트에서 사용됩니다. 주석은 메시지 또는 헤더에서 정보를 추출한 다음 추출된 데이터를 blank의 메서드 셰이프에 삽입하는 편리한 방법을 제공합니다.

예를 들어, 8080, myBeanProc 에서는 filter() EIP의 서술자로 호출됩니다. 8080의 checkCredentials 메서드가 true 를 반환하면 메시지는 계속 진행할 수 있지만 메서드에서 false 를 반환하는 경우 해당 메시지는 필터에 의해 차단됩니다. 필터 패턴은 다음과 같이 구현됩니다.

// Java
MyBeanProcessor myBeanProc = new MyBeanProcessor();

from("SourceURL")
  .filter().method(myBeanProc, "checkCredentials")
  .to("TargetURL");

MyBeanProcessor 클래스의 구현은 다음과 같이 @XPath 주석을 악용하여 기본 XML 메시지에서 사용자 이름과 암호를 추출합니다.

// Java
import org.apache.camel.language.XPath;

public class MyBeanProcessor {
    boolean void checkCredentials(
        @XPath("/credentials/username/text()") String user,
        @XPath("/credentials/password/text()") String pass
    ) {
        // Check the user/pass credentials...
        ...
    }
}

@XPath 주석은 삽입되는 매개변수 바로 앞에 배치됩니다. path에 /text() 를 추가하여 명시적으로 텍스트 노드를 선택하는 방법을 확인할 수 있습니다. 이렇게 하면 요소의 콘텐츠만 enclosing 태그가 아닌 선택되어 있는지 확인합니다.

13.2.8. Camel 엔드 포인트 URI로 사용

Camel Language 구성 요소를 사용하여 엔드포인트 URI에서 지원되는 언어를 호출할 수 있습니다. 두 가지 대체 구문이 있습니다.

파일(또는 Scheme)에 저장된 언어 스크립트를 호출하려면 다음 URI 구문을 사용합니다.

language://LanguageName:resource:Scheme:Location[?Options]

여기서 스키마는 파일(, classpath: 또는 http: )일 수 있습니다.

예를 들어 다음 경로는 classpath에서 mysimplescript.txt 를 실행합니다.

from("direct:start")
  .to("language:simple:classpath:org/apache/camel/component/language/mysimplescript.txt")
  .to("mock:result");

포함된 언어 스크립트를 호출하려면 다음 URI 구문을 사용합니다.

language://LanguageName[:Script][?Options]

예를 들어 스크립트 문자열에 저장된 단순 언어 스크립트를 실행하려면 다음을 수행합니다.

String script = URLEncoder.encode("Hello ${body}", "UTF-8");
from("direct:start")
  .to("language:simple:" + script)
  .to("mock:result");

언어 구성 요소에 대한 자세한 내용은 Apache Camel 구성 요소 참조 가이드의 언어 를 참조하십시오.