8.2. 메시지 필터

8.2.1. 개요

메시지 필터 는 특정 기준에 따라 바람직하지 않은 메시지를 제거하는 프로세서입니다. Apache Camel에서 그림 8.2. “메시지 필터 패턴” 에 표시된 메시지 필터 패턴은 filter() Java DSL 명령으로 구현됩니다. filter() 명령은 필터를 제어하는 단일 서술자 인수를 사용합니다. 서술자가 true 이면 들어오는 메시지가 계속 진행할 수 있으며 서술자가 false 이면 들어오는 메시지가 차단됩니다.

그림 8.2. 메시지 필터 패턴

메시지 필터 패턴

8.2.2. Java DSL 예

다음 예제에서는 foo 헤더에 값이 있는 메시지를 제외한 모든 메시지를 차단하는 끝점, seda:a, to endpoint, seda:b 에서 경로를 생성하는 방법을 보여줍니다.

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
        from("seda:a").filter(header("foo").isEqualTo("bar")).to("seda:b");
    }
};

더 복잡한 필터 서술자를 평가하려면 Cryostat, XQuery 또는 SQL과 같은 지원되는 스크립팅 언어 중 하나를 호출할 수 있습니다( II 부. 라우팅 표현식 및 서술자 언어참조). 다음 예제에서는 name 속성이 Cryostat와 같은 person 요소가 포함된 사용자를 제외한 모든 메시지를 차단하는 경로를 정의합니다.

from("direct:start").
        filter().xpath("/person[@name='James']").
        to("mock:result");

8.2.3. XML 구성 예

다음 예제에서는 XML에서 Cryostat 서술자를 사용하여 경로를 구성하는 방법을 보여줍니다( II 부. 라우팅 표현식 및 서술자 언어참조).

<camelContext id="simpleFilterRoute" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="seda:a"/>
    <filter>
      <xpath>$foo = 'bar'</xpath>
      <to uri="seda:b"/>
    </filter>
  </route>
  </camelContext>
</filter> 태그 내에 필터링된 끝점 필요

닫는 </filter> 태그 전에 필터링할 끝점(예 : <to uri="seda:b" / > )을 배치하거나 필터가 적용되지 않는지 확인합니다( 2.8+를 생략하면 오류가 발생합니다).

8.2.4. 빈으로 필터링

빈을 사용하여 필터 동작을 정의하는 예는 다음과 같습니다.

from("direct:start")
     .filter().method(MyBean.class, "isGoldCustomer").to("mock:result").end()
     .to("mock:end");

public static class MyBean {
    public boolean isGoldCustomer(@Header("level") String level) {
        return level.equals("gold");
    }
}

8.2.5. stop() 사용

Camel 2.0에서 사용 가능

stop은 모든 메시지를 필터링하는 특수한 유형의 필터입니다. Stop은 서술자 중 하나에서 추가 처리를 중지해야 하는 경우 콘텐츠 기반 라우터에서 사용하기 편리합니다.

다음 예제에서는 메시지 본문에 Bye 라는 메시지가 있는 메시지가 경로에서 더 이상 전파되는 것을 원하지 않습니다. when() 서술자에서 .stop() 을 사용하는 것을 방지합니다.

from("direct:start")
    .choice()
        .when(bodyAs(String.class).contains("Hello")).to("mock:hello")
        .when(bodyAs(String.class).contains("Bye")).to("mock:bye").stop()
        .otherwise().to("mock:other")
    .end()
    .to("mock:result");

8.2.6. 교환이 필터링되었는지 여부를 알고

Camel 2.5부터 사용 가능

메시지 필터 EIP는 필터링되었는지 여부를 나타내는 Exchange에 속성을 추가합니다.

속성에는 CamelFilterMatched 의 문자열 값이 있는 Exchange.FILTER_MATCHED 키가 있습니다. 해당 값은 true 또는 false 를 나타내는 부울 값입니다. 값이 true 이면 Exchange가 필터 블록에서 라우팅되었습니다.