1.5. 프로세서
1.5.1. 개요
라우터에서 단순히 소비자 엔드포인트를 생산자 엔드포인트에 연결하는 것보다 더 흥미로운 작업을 수행할 수 있도록 경로에 프로세서를 추가할 수 있습니다. 프로세서는 라우팅 규칙에 삽입하여 규칙을 통과하는 메시지를 임의의 처리를 수행할 수 있는 명령입니다. Apache Camel은 표 1.1. “Apache Camel 프로세서” 와 같이 다양한 프로세서를 제공합니다.
Java DSL | XML DSL | 설명 |
---|---|---|
|
| 8.5절. “수집기”여러 개의 들어오는 교환을 단일 교환으로 결합하는 집계기를 생성합니다. |
|
| 지정된 하위 경로 전후에 작업을 수행하려면 Aspect Oriented Programming (AOP)을 사용합니다. |
|
| Java 개체(또는 8080)에서 메서드를 호출하여 현재 교환을 처리합니다. 2.4절. “Cryostat 통합”을 참조하십시오. |
|
|
8.1절. “콘텐츠 기반 라우터”: 교환 컨텐츠에 따라 |
|
| 메시지 본문을 지정된 형식으로 변환합니다.Converts the In message body to the specified type. |
|
| 8.9절. “Delayer”: 경로의 마지막 부분으로 교환의 전파를 지연합니다. |
|
|
|
| 해당 없음 | 현재 명령 블록을 종료합니다. |
|
| 10.1절. “콘텐츠 Enricher”: 현재 교환과 지정된 생산자 엔드포인트 URI에서 요청된 데이터를 결합합니다. |
|
| 8.2절. “메시지 필터”: 서술자 표현식을 사용하여 들어오는 교환을 필터링합니다. |
|
| 11.8절. “idempotent 소비자”: 중복 메시지를 억제하는 전략을 구현합니다. |
|
| 특정 경로 노드에서 상속된 오류 처리기를 비활성화하는 데 사용할 수 있는 부울 옵션(Java DSL에서 하위 항목으로 정의됨 및 XML DSL의 속성으로 정의됨). |
|
| 현재 교환의 MEP를 InOnly (패키지 없는 경우)로 설정하거나 교환을 지정된 엔드포인트에 InOnly 로 보냅니다. |
|
| 현재 교환의 MEP를 InOut (패키지 없는 경우)로 설정하거나 지정된 엔드포인트에 InOut 으로 교환을 보냅니다. |
|
| 8.10절. “로드 밸런서”끝점 컬렉션에 대한 로드 밸런싱을 구현합니다. |
|
| 콘솔에 메시지를 기록합니다. |
|
| 8.16절. “loop”: 각 교환을 경로의 마지막 부분으로 반복적으로 다시 보냅니다. |
|
|
현재 롤백에 대한 트랜잭션만 표시합니다(예외가 발생하지 않음). XML DSL에서 이 옵션은 |
|
|
하나 이상의 트랜잭션이 이전에 이 스레드와 연결된 후 일시 중지된 경우 이 명령은 롤백에 대한 최신 트랜잭션만 표시합니다(예외 발생 없음). XML DSL에서 이 옵션은 |
|
| 특정 전송 프로토콜을 통해 전송하기 위해 지정된 데이터 형식을 사용하여 하위 수준 또는 바이너리 형식으로 변환합니다. |
|
| 8.13절. “멀티 캐스트”: 여러 대상에 대한 현재 교환을 멀티 캐스트하여 각 대상의 자체 복사본을 교환합니다. |
|
|
기본 경로가 완료된 후 실행되는 하위 경로(Java DSL에서 |
|
|
지정된 예외가 발생할 때마다 실행되는 하위 경로(Java DSL에서 |
|
| 5.4절. “파이프 및 필터”하나의 끝점의 출력이 다음 끝점의 입력이 되는 일련의 끝점으로 교환을 보냅니다. 2.1절. “파이프라인 처리” 을 참조하십시오. |
|
| 현재 경로에 정책을 적용합니다(현재는 트랜잭션 정책에서만 사용됨- Cryostat 참조 Apache Karaf 트랜잭션 가이드 ). |
|
| 10.1절. “콘텐츠 Enricher”: 지정된 소비자 끝점 URI에서 폴링된 데이터와 현재 교환을 결합합니다. |
|
| 현재 교환에서 사용자 지정 프로세서를 실행합니다. “사용자 정의 프로세서” 및 III 부. 고급 Camel 프로그래밍 을 참조하십시오. |
|
| 8.3절. “수신자 목록”: 교환을 런타임에 계산된 수신자 목록으로 보냅니다(예: 헤더 내용에 따라 다름). |
|
| 교환의 In 메시지에서 지정된 헤더를 제거합니다. |
|
|
교환의 In 메시지에서 지정된 패턴과 일치하는 헤더를 제거합니다. 패턴의 형식은 |
|
| 지정된 교환 속성을 제거합니다. |
|
|
지정된 패턴과 일치하는 속성을 교환에서 제거합니다. 쉼표로 구분된 1개 이상의 문자열 목록을 인수로 사용합니다. 첫 번째 문자열은 패턴입니다(위의 |
|
| 8.6절. “Resequencer”: 지정된 비교 작업을 기반으로 들어오는 교환을 다시 주문합니다. 일괄 처리 모드 및 스트림 모드를 지원합니다. |
|
| (기본값) 현재 트랜잭션에 대한 롤백만 표시합니다(기본적으로 예외도 발생). Apache Karaf 트랜잭션 가이드를 참조하십시오. |
|
| 8.7절. “라우팅 슬립”: 슬립 헤더에서 추출된 끝점 URI 목록을 기반으로 동적으로 구성된 파이프라인을 통해 교환을 라우팅합니다. |
|
| 샘플링 throttler를 생성하여 경로의 트래픽에서 교환 샘플을 추출할 수 있습니다. |
|
| 교환의 메시지 본문을 설정합니다. |
|
| 현재 교환의 MEP를 지정된 값으로 설정합니다. “메시지 교환 패턴”을 참조하십시오. |
|
| 교환의 In 메시지에 지정된 헤더를 설정합니다. |
|
| 교환의 아웃 메시지에 지정된 헤더를 설정합니다. |
|
| 지정된 교환 속성을 설정합니다. |
|
| 메시지 본문 의 내용을 정렬합니다(사용자 지정 비교기를 선택적으로 지정할 수 있음). |
|
| 8.4절. “Splitter”: 현재 교환을 일련의 교환으로 분할하여 각 분할 교환에는 원본 메시지 본문의 조각이 포함됩니다. |
|
| 현재 교환 라우팅을 중지하고 완료된 것으로 표시합니다. |
|
| 경로의 마지막 부분을 동시에 처리하기 위한 스레드 풀을 생성합니다. |
|
| 8.8절. “Throttler”: 흐름 속도를 지정된 수준으로 제한합니다(초당 교환). |
|
| 지정된 Java 예외를 throw합니다. |
|
| 교환을 하나 이상의 엔드포인트로 전송합니다. 2.1절. “파이프라인 처리”을 참조하십시오. |
| 해당 없음 |
문자열 형식을 사용하여 교환을 엔드포인트로 보냅니다. 즉, 엔드포인트 URI 문자열은 C Cryostat |
|
| 경로의 마지막 부분을 포함하는 Spring 트랜잭션 범위를 생성합니다. Apache Karaf 트랜잭션 가이드를 참조하십시오. |
|
| 5.6절. “메시지#159”: 메시지 헤더를 Out 메시지 헤더에 복사하고 Out 메시지 본문을 지정된 값으로 설정합니다. |
|
| 지정된 데이터 형식을 사용하여 In 메시지 본문을 하위 수준 또는 바이너리 형식에서 상위 수준 형식으로 변환합니다. |
|
|
서술자 표현식을 사용하여 현재 메시지가 유효한지 여부를 테스트합니다. 서술자가 |
|
|
12.3절. “Wire Tap”: |
1.5.2. 일부 샘플 프로세서
경로에서 프로세서를 사용하는 방법에 대한 몇 가지 아이디어를 얻으려면 다음 예제를 참조하십시오.
1.5.3. 선택
choice()
프로세서는 들어오는 메시지를 대체 생산자 엔드포인트로 라우팅하는 데 사용되는 조건부 명령문입니다. 각 대체 생산자 끝점 앞에는 서술자 인수를 사용하는 when()
메서드 앞에 옵니다. 서술자가 true이면 다음 대상이 선택되고, 처리는 규칙에서 다음 when()
메서드로 진행됩니다. 예를 들어 다음 choice()
프로세서는 Predicate1 및 Predicate2 의 값에 따라 수신 메시지를 Target1,Target2 또는 Target3 으로 보냅니다.
from("SourceURL") .choice() .when(Predicate1).to("Target1") .when(Predicate2).to("Target2") .otherwise().to("Target3");
Spring XML과 동일합니다.
<camelContext id="buildSimpleRouteWithChoice" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="SourceURL"/> <choice> <when> <!-- First predicate --> <simple>header.foo = 'bar'</simple> <to uri="Target1"/> </when> <when> <!-- Second predicate --> <simple>header.foo = 'manchu'</simple> <to uri="Target2"/> </when> <otherwise> <to uri="Target3"/> </otherwise> </choice> </route> </camelContext>
Java DSL에는 endChoice()
명령을 사용해야 할 수 있는 특수한 경우가 있습니다. 일부 표준 Apache Camel 프로세서를 사용하면 특수 하위 복제를 사용하여 추가 매개 변수를 지정할 수 있으며 일반적으로 end()
명령으로 종료되는 추가 중첩 수준을 효과적으로 열 수 있습니다. 예를 들어 로드 밸런서 절을 loadBalance().to("mock:foo").to("mock:bar").end()
로 지정할 수 있습니다.
그러나 로드 밸런서 절이 선택 조건에 포함된 경우 다음과 같이
endChoice()
명령을 사용하여 절을 종료해야 합니다.
from("direct:start") .choice() .when(bodyAs(String.class).contains("Camel")) .loadBalance().roundRobin().to("mock:foo").to("mock:bar").endChoice() .otherwise() .to("mock:result");
1.5.4. filter
filter()
프로세서는 관심 없는 메시지가 생산자 엔드포인트에 도달하지 못하도록 하는 데 사용할 수 있습니다. 단일 서술자 인수가 필요합니다. 서술자가 true이면 메시지 교환이 생산자를 통해 허용됩니다. 서술자가 false이면 메시지 교환이 차단됩니다. 예를 들어 다음 필터는 들어오는 메시지에 헤더를 포함하지 않는 한 메시지 교환을 차단합니다. foo
값은 bar
와 같습니다.
from("SourceURL").filter(header("foo").isEqualTo("bar")).to("TargetURL");
Spring XML과 동일합니다.
<camelContext id="filterRoute" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="SourceURL"/> <filter> <simple>header.foo = 'bar'</simple> <to uri="TargetURL"/> </filter> </route> </camelContext>
1.5.5. Throttler
throttle()
프로세서는 생산자 엔드포인트가 과부하되지 않도록 합니다. throttler는 초당 전달할 수 있는 메시지 수를 제한하여 작동합니다. 들어오는 메시지가 지정된 속도를 초과하면 throttler는 버퍼에서 초과 메시지를 누적하고 생산자 엔드포인트로 더 느리게 전송합니다. 예를 들어 처리량 속도를 초당 100개 메시지로 제한하려면 다음 규칙을 정의할 수 있습니다.
from("SourceURL").throttle(100).to("TargetURL");
Spring XML과 동일합니다.
<camelContext id="throttleRoute" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="SourceURL"/> <throttle maximumRequestsPerPeriod="100" timePeriodMillis="1000"> <to uri="TargetURL"/> </throttle> </route> </camelContext>
1.5.6. 사용자 정의 프로세서
여기에 설명된 표준 프로세서 중 어느 것도 필요한 기능을 제공하지 않으면 항상 고유한 사용자 지정 프로세서를 정의할 수 있습니다. 사용자 지정 프로세서를 만들려면 org.apache.camel.Processor
인터페이스를 구현하고 process()
메서드를 재정의하는 클래스를 정의합니다. 다음 사용자 지정 프로세서인 MyProcessor
는 들어오는 메시지에서 foo
라는 헤더를 제거합니다.
예 1.3. 사용자 지정 프로세서 클래스 구현
public class MyProcessor implements org.apache.camel.Processor { public void process(org.apache.camel.Exchange exchange) { inMessage = exchange.getIn(); if (inMessage != null) { inMessage.removeHeader("foo"); } } };
사용자 지정 프로세서를 라우터 규칙에 삽입하려면 프로세스에 프로세서를 삽입하는 일반적인 메커니즘을 제공하는 process()
메서드를 호출합니다. 예를 들어 다음 규칙은 예 1.3. “사용자 지정 프로세서 클래스 구현” 에 정의된 프로세서를 호출합니다.
org.apache.camel.Processor myProc = new MyProcessor(); from("SourceURL").process(myProc).to("TargetURL");