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< (resp. 한정자)는 다음과 같이 매개 변수가 있는 이벤트 유형 (예: 이벤트 한정자로) 자동으로 변환됩니다.
T > 삽입 지점의 유형 변수 T
@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 컨텍스트 모델을 검색할 수 없기 때문에 엔드포인트 인스턴스와 관찰자 메서드 간의 효율적인 바인딩을 방지할 수 있습니다.