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> 태그 전에 필터링할 끝점(예 : <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가 필터 블록에서 라우팅되었습니다.