12.3. Wire Tap

12.3.1. Wire Tap

그림 12.1. “Wire Tap 패턴” 에 표시된 유선 탭 패턴을 사용하면 원본 메시지가 최종 대상으로 전달되는 동안 메시지 사본을 별도의 탭 위치로 라우팅할 수 있습니다.

그림 12.1. Wire Tap 패턴

유선 탭
Streams

스트림 메시지 본문을 WireTap 하는 경우 스트림 캐싱 을 활성화하여 메시지 본문을 다시 읽을 수 있도록 해야 합니다. Stream Caching에서 자세한 내용을 참조하십시오.

12.3.2. triggertap 노드

Apache Camel 2.0은 유선 탭을 수행하기 위해 wireTap 노드를 도입했습니다. Tap 노드는 원본 교환을 단방향 스타일로 전파해야 하므로 교환 패턴이 InOnly 로 설정되어 있는 탭 교환으로 복사합니다. 탭된 교환은 기본 경로와 동시에 실행될 수 있도록 별도의 스레드에서 처리됩니다.

wireTap 은 교환을 활용하는 두 가지 방법을 지원합니다.

  • 원본 교환의 사본을 탭합니다.
  • 새 교환 인스턴스를 탭하여 탭된 교환을 사용자 지정할 수 있습니다.
참고

Camel 2.16에서 Wire Tap EIP는 원격 탭 대상으로 교환을 보낼 때 이벤트 알림을 발송합니다.

참고

Camel 2.20 부터는 닫는 동안 Wire Tap EIP가 작동 중단되는 모든 불광선 워킹을 완료합니다.

12.3.3. 원본 교환의 사본을 탭

Java DSL 사용:

from("direct:start")
    .to("log:foo")
    .wireTap("direct:tap")
    .to("mock:result");

Spring XML 확장 사용:

<route>
    <from uri="direct:start"/>
    <to uri="log:foo"/>
    <wireTap uri="direct:tap"/>
    <to uri="mock:result"/>
</route>

12.3.4. 원본 교환의 사본을 탭하고 수정

Apache Camel은 Java DSL을 사용하여 원래 교환의 복사본을 수정하는 프로세서 또는 표현식 사용을 지원합니다. 프로세서를 사용하면 속성, 헤더 등을 설정할 수 있으므로 교환이 채워지는 방식에 대한 전체 성능이 제공됩니다. 표현식 접근 방식은 In 메시지 본문을 수정하는 데만 사용할 수 있습니다.

예를 들어 프로세서 접근 방식을 사용하여 원래 교환의 사본을 수정하려면 다음을 수행합니다.

from("direct:start")
    .wireTap("direct:foo", new Processor() {
        public void process(Exchange exchange) throws Exception {
            exchange.getIn().setHeader("foo", "bar");
        }
    }).to("mock:result");

from("direct:foo").to("mock:foo");

그리고 표현식 접근 방식을 사용하여 원래 교환의 사본을 수정하려면 다음을 수행하십시오.

from("direct:start")
    .wireTap("direct:foo", constant("Bye World"))
    .to("mock:result");

from("direct:foo").to("mock:foo");

Spring XML 확장을 사용하여 프로세서 접근 방식을 사용하여 원래 교환의 복사본을 수정할 수 있습니다. 여기서 processorRef 속성은 myProcessor ID를 사용하여 Spring metrics을 참조합니다.

<route>
    <from uri="direct:start2"/>
    <wireTap uri="direct:foo" processorRef="myProcessor"/>
    <to uri="mock:result"/>
</route>

그리고 표현식 접근 방식을 사용하여 원래 교환의 사본을 수정하려면 다음을 수행하십시오.

<route>
    <from uri="direct:start"/>
    <wireTap uri="direct:foo">
        <body><constant>Bye World</constant></body>
    </wireTap>
    <to uri="mock:result"/>
</route>

12.3.5. 새 교환 인스턴스 탭

copy 플래그를 false 로 설정하여 새 교환 인스턴스로wiretap을 정의할 수 있습니다(기본값은 true). 이 경우wiretap에 대해 처음에 비어 있는 교환이 생성됩니다.

예를 들어 프로세서 접근 방식을 사용하여 새 교환 인스턴스를 생성하려면 다음을 수행합니다.

from("direct:start")
    .wireTap("direct:foo", false, new Processor() {
        public void process(Exchange exchange) throws Exception {
            exchange.getIn().setBody("Bye World");
            exchange.getIn().setHeader("foo", "bar");
        }
    }).to("mock:result");

from("direct:foo").to("mock:foo");

두 번째 wireTap 인수가 copy 플래그를 false 로 설정하여 원래 교환이 복사 되지 않고 대신 빈 교환이 생성됨을 나타냅니다.

표현식 접근 방식을 사용하여 새 교환 인스턴스를 생성하려면 다음을 수행합니다.

from("direct:start")
    .wireTap("direct:foo", false, constant("Bye World"))
    .to("mock:result");

from("direct:foo").to("mock:foo");

Spring XML 확장을 사용하면 wireTap 요소의 copy 속성을 false 로 설정하여 새 교환을 만들 것임을 나타낼 수 있습니다.

프로세서 접근 방식을 사용하여 새 교환 인스턴스를 생성하려면 다음과 같이 processorRef 속성이 myProcessor ID를 사용하여 Spring 빈을 참조합니다.

<route>
    <from uri="direct:start2"/>
    <wireTap uri="direct:foo" processorRef="myProcessor" copy="false"/>
    <to uri="mock:result"/>
</route>

그리고 표현식 접근 방식을 사용하여 새 교환 인스턴스를 생성하려면 다음을 수행합니다.

<route>
    <from uri="direct:start"/>
    <wireTap uri="direct:foo" copy="false">
        <body><constant>Bye World</constant></body>
    </wireTap>
    <to uri="mock:result"/>
</route>

12.3.6. 새 Exchange 전송 및 DSL에서 헤더 설정

Camel 2.8 사용 가능

12.3절. “Wire Tap” 를 사용하여 새 메시지를 보내는 경우 DSL의 II 부. 라우팅 표현식 및 서술자 언어 를 사용하여 메시지 본문만 설정할 수 있습니다. 새 헤더도 설정해야 하는 경우 1.5절. “프로세서” 를 사용해야 합니다. 따라서 Camel 2.8 이상에서 이 상황을 개선하여 DSL에서 헤더를 설정할 수 있습니다.

다음 예제에서는 다음과 같은 새 메시지를 보냅니다.

  • 메시지 본문으로 "bye World"
  • 값이 123인 키 "id"가 있는 헤더
  • 현재 날짜가 value인 키 "date"가 있는 헤더

12.3.7. Java DSL

from("direct:start")
     // tap a new message and send it to direct:tap
     // the new message should be Bye World with 2 headers
     .wireTap("direct:tap")
         // create the new tap message body and headers
         .newExchangeBody(constant("Bye World"))
         .newExchangeHeader("id", constant(123))
         .newExchangeHeader("date", simple("${date:now:yyyyMMdd}"))
     .end()
     // here we continue routing the original messages
     .to("mock:result");

 // this is the tapped route
 from("direct:tap")
     .to("mock:tap");

12.3.8. XML DSL

XML DSL은 메시지 본문 및 헤더를 구성하는 방법과 Java DSL과 약간 다릅니다. XML에서는 다음과 같이 <body> 및 <setHeader>를 사용합니다.

<route>
     <from uri="direct:start"/>
     <!-- tap a new message and send it to direct:tap -->
     <!-- the new message should be Bye World with 2 headers -->
     <wireTap uri="direct:tap">
         <!-- create the new tap message body and headers -->
         <body><constant>Bye World</constant></body>
         <setHeader headerName="id"><constant>123</constant></setHeader>
         <setHeader headerName="date"><simple>${date:now:yyyyMMdd}</simple></setHeader>
     </wireTap>
     <!-- here we continue routing the original message -->
     <to uri="mock:result"/>
 </route>

12.3.9. URI 사용

Wire Tap은 정적 및 동적 엔드 포인트 URI를 지원합니다. 정적 엔드포인트 URI는 Camel 2.20 부터 사용할 수 있습니다.

다음 예제에서는 헤더 ID가 큐 이름의 일부인 JMS 큐를 타이핑하는 방법을 표시합니다.

from("direct:start")
   .wireTap("jms:queue:backup-${header.id}")
   .to("bean:doSomething");

동적 끝점 URI에 대한 자세한 내용은 “동적 대상” 을 참조하십시오.

12.3.10. onPrepare를 사용하여 메시지를 준비할 때 사용자 정의 논리 실행

Camel 2.8 사용 가능

자세한 내용은 8.13절. “멀티 캐스트”의 내용을 참조하십시오.

12.3.11. 옵션

wireTap DSL 명령은 다음 옵션을 지원합니다.

이름

기본값

설명

uri

 

endpoint uri where to send thewire tapped message. uri 또는 ref 중 하나를 사용해야 합니다.

ref

 

전선 탭된 메시지를 보낼 끝점을 나타냅니다. uri 또는 ref 중 하나를 사용해야 합니다.

executorServiceRef

 

알 수 있는 메시지를 처리할 때 사용할 사용자 지정 2.8절. “스레드 모델” 을 나타냅니다. 설정되지 않은 경우 Camel은 기본 스레드 풀을 사용합니다.

processorRef

 

새 메시지를 생성하는 데 사용할 사용자 정의 1.5절. “프로세서”를 나타냅니다(예: 새 메시지 모드 전송). 아래를 참조하십시오.

복사

true

Camel 2.3: 메시지를 탭할 때 사용할 “교환” 복사본이 있어야 합니다.

onPrepareRef

 

Camel 2.8: “교환” 복사본을 준비하려면 사용자 지정 1.5절. “프로세서” 을 참조하십시오. 이를 통해 필요한 경우 메시지 페이로드를 깊이 복제하는 등 사용자 지정 논리를 수행할 수 있습니다.