11.6. 선택적 소비자
11.6.1. 개요
그림 11.5. “선택적 소비자 패턴” 에 표시된 선택적 소비자 패턴은 수신 메시지에 필터를 적용하여 특정 선택 기준을 충족하는 메시지만 처리하는 소비자를 설명합니다.
그림 11.5. 선택적 소비자 패턴
다음 방법 중 하나를 사용하여 Apache Camel에서 선택적 소비자 패턴을 구현할 수 있습니다.
11.6.2. JMS 선택기
JMS 선택기는 JMS 헤더 및 JMS 속성을 포함하는 서술자 표현식입니다. 선택기가 true
로 평가되면 JMS 메시지가 소비자에 도달할 수 있으며 선택기가 false
로 평가되면 JMS 메시지가 차단됩니다. 예를 들어 큐의 메시지를 사용하고 국가 코드 속성이 US
인 메시지만 선택하려면 다음 Java DSL 경로를 사용할 수 있습니다.
from("jms:selective?selector=" + java.net.URLEncoder.encode("CountryCode='US'","UTF-8")). to("cxf:bean:replica01");
쿼리 옵션 구문 분석 문제를 방지하려면 선택기 문자열인 selector 문자열( Code='US'
)이 URL로 인코딩되어야 합니다( UTF-8 문자 사용). 이 예에서는 JMS 속성인 Code
가 보낸 사람에 의해 설정되었다고 가정합니다. JMS 선택기에 대한 자세한 내용은 “JMS 선택기” 을 참조하십시오.
선택기가 JMS 큐에 적용되는 경우 선택되지 않은 메시지는 큐에서 남아 있으며 동일한 큐에 연결된 다른 소비자가 사용할 수 있습니다.
11.6.3. ActiveMQ의 JMS 선택기
ActiveMQ 엔드포인트에 JMS 선택기를 정의할 수도 있습니다. 예를 들면 다음과 같습니다.
from("acivemq:selective?selector=" + java.net.URLEncoder.encode("CountryCode='US'","UTF-8")). to("cxf:bean:replica01");
자세한 내용은 ActiveMQ: JMS Selectors 및 ActiveMQ Message Properties 를 참조하십시오.
11.6.4. 메시지 필터
소비자 끝점에서 선택기를 설정할 수 없는 경우 대신 필터 프로세서를 경로에 삽입할 수 있습니다. 예를 들어 다음과 같이 Java DSL을 사용하여 미국 국가 코드가 있는 메시지만 처리하는 선택적 소비자를 정의할 수 있습니다.
from("seda:a").filter(header("CountryCode").isEqualTo("US")).process(myProcessor);
다음과 같이 XML 구성을 사용하여 동일한 경로를 정의할 수 있습니다.
<camelContext id="buildCustomProcessorWithFilter" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="seda:a"/> <filter> <xpath>$CountryCode = 'US'</xpath> <process ref="#myProcessor"/> </filter> </route> </camelContext>
Apache Camel 필터 프로세서에 대한 자세한 내용은 8.2절. “메시지 필터” 을 참조하십시오.
메시지 필터를 사용하여 JMS 대기열에서 메시지를 선택합니다. 필터 프로세서를 사용하는 경우 차단된 메시지는 간단히 삭제됩니다. 따라서 대기열에서 메시지가 사용되는 경우(각 메시지를 한 번만 사용할 수 있습니다. 11.4절. “경쟁 소비자”참조) 차단된 메시지는 전혀 처리되지 않습니다. 이는 원하는 동작이 아닐 수 있습니다.