59.10. CDI 이벤트 끝점

Camel 2.17로 사용 가능

CDI 이벤트 끝점은 Camel 경로를 사용하여 CDI 이벤트 를 브리지하므로 Camel 소비자(C Camel 프로듀서에서 일시 중지)에서 CDI 이벤트를 원활하게 관찰/사용/시행할 수 있습니다.

Camel CDI에서 제공하는 CdiEventEndpoint<T > 빈을 사용하여 이벤트 유형이 T 인 CDI 이벤트 를 관찰하거나 사용할 수 있습니다. 예를 들면 다음과 같습니다.

@Inject
CdiEventEndpoint<String> cdiEventEndpoint;

from(cdiEventEndpoint).log("CDI event received: ${body}");

이는 쓰기와 동일합니다.

@Inject
@Uri("direct:event")
ProducerTemplate producer;

void observeCdiEvents(@Observes String event) {
    producer.sendBody(event);
}

from("direct:event").log("CDI event received: ${body}");

반대로 CdiEventEndpoint<T > 빈을 사용하여 이벤트 유형이 T 인 / fire CDI 이벤트 를 생성할 수 있습니다. 예를 들면 다음과 같습니다.

@Inject
CdiEventEndpoint<String> cdiEventEndpoint;

from("direct:event").to(cdiEventEndpoint).log("CDI event sent: ${body}");

이는 쓰기와 동일합니다.

@Inject
Event<String> event;

from("direct:event").process(new Processor() {
    @Override
    public void process(Exchange exchange) {
        event.fire(exchange.getBody(String.class));
    }
}).log("CDI event sent: ${body}");

또는 Java 8 람다 식을 사용할 수 있습니다.

@Inject
Event<String> event;

from("direct:event")
    .process(exchange -> event.fire(exchange.getIn().getBody(String.class)))
    .log("CDI event sent: ${body}");

특정 CdiEventEndpoint< T > 삽입 지점의 유형 변수 T (resp. 한정자)는 다음과 같이 매개 변수가 있는 이벤트 유형 (예: 이벤트 한정자로) 자동으로 변환됩니다.

@Inject
@FooQualifier
CdiEventEndpoint<List<String>> cdiEventEndpoint;

from("direct:event").to(cdiEventEndpoint);

void observeCdiEvents(@Observes @FooQualifier List<String> event) {
    logger.info("CDI event: {}", event);
}

CDI 컨테이너에 여러 Camel 컨텍스트가 있는 경우 @ContextName 와 같은 Camel 컨텍스트 빈 한정자를 사용하여 CdiEventEndpoint<T > 삽입 지점을 받을 수 있습니다. 예를 들면 다음과 같습니다.

@Inject
@ContextName("foo")
CdiEventEndpoint<List<String>> cdiEventEndpoint;
// Only observes / consumes events having the @ContextName("foo") qualifier
from(cdiEventEndpoint).log("Camel context (foo) > CDI event received: ${body}");
// Produces / fires events with the @ContextName("foo") qualifier
from("...").to(cdiEventEndpoint);

void observeCdiEvents(@Observes @ContextName("foo") List<String> event) {
    logger.info("Camel context (foo) > CDI event: {}", event);
}

CDI 이벤트 Camel 엔드포인트는 이벤트 유형 및 이벤트 한정 자의 각각의 고유한 조합에 대해 관찰자 방법 을 동적으로 추가하고 컨테이너 유형 안전 관찰자 해상도 에만 의존하여 가능한 한 효율적으로 구현을 유도합니다.

또한 CDI의 유형 안전 속성과 Camel 구성 요소 모델의 동적 특성이 매우 높기 때문에 URI 를 통해 CDI 이벤트 Camel 엔드포인트의 인스턴스를 생성할 수 없습니다. 실제로 CDI 이벤트 구성 요소의 URI 형식은 다음과 같습니다.

cdi-event://PayloadType<T1,...,Tn>[?qualifiers=QualifierType1[,...[,QualifierTypeN]...]]

authority PayloadType (resp. the QualifierType)을 사용하는 경우 페이로드 매개 변수 유형에 대한 각도 괄호로 구분된 페이로드(resp. modifier) 원시 유형의 URI로 이스케이프된 URI가 됩니다. 이는  숙한 URI로 이어집니다. 예를 들면 다음과 같습니다.

cdi-event://org.apache.camel.cdi.example.EventPayload%3Cjava.lang.Integer%3E?qualifiers=org.apache.camel.cdi.example.FooQualifier%2Corg.apache.camel.cdi.example.BarQualifier

그러나 근본적으로는 CDI 컨테이너가 배포 단계에서 Camel 컨텍스트 모델을 검색할 수 없기 때문에 엔드포인트 인스턴스와 관찰자 메서드 간의 효율적인 바인딩을 방지할 수 있습니다.