60.10. CDI 이벤트 끝점
Camel 2.17 사용 가능
CDI 이벤트 끝점은 Camel 경로와 CDI 이벤트를 연결하여 Camel 소비자(예: Camel 생산자가)에서 CDI 이벤트를 원활하게 / 소비(resp. produced / fired)할 수 있도록 합니다.
Camel CDI에서 제공하는 CdiEventEndpoint<T
> Quarkus를 사용하여 이벤트 유형이 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
> scaling을 사용하여 이벤트 유형이 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.)는 매개 변수가 있는 이벤트 유형 (resp. into the event qualifiers)으로 자동 변환됩니다.
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. qualifier) 원시 유형의 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 컨텍스트 모델을 검색할 방법이 없기 때문에 엔드포인트 인스턴스와 관찰자 방법 간의 효율적인 바인딩을 방지할 수 있습니다.