59.5. 여러 Camel 컨텍스트

위의 설명대로 애플리케이션에서 CamelContext 빈을 실제로 선언할 수 있습니다. 이 경우 이러한 CamelContext 빈에 선언된 CDI 한정자는 Camel 경로 및 기타 Camel 프리미티브를 해당 Camel 컨텍스트에 바인딩하는 데 사용됩니다. 예를 들어 다음 빈이 선언되는 경우:

@ApplicationScoped
@ContextName("foo")
class FooCamelContext extends DefaultCamelContext {
}

@ApplicationScoped
@BarContextQualifier
class BarCamelContext extends DefaultCamelContext {
}
 
@ContextName("foo")
class RouteAddedToFooCamelContext extends RouteBuilder {

    @Override
    public void configure() {
        // ...
    }
}
 
@BarContextQualifier
class RouteAddedToBarCamelContext extends RouteBuilder {

    @Override
    public void configure() {
        // ...
    }
}
 
@ContextName("baz")
class RouteAddedToBazCamelContext extends RouteBuilder {

    @Override
    public void configure() {
        // ...
    }
}
 
@MyOtherQualifier
class RouteNotAddedToAnyCamelContext extends RouteBuilder {

    @Override
    public void configure() {
        // ...
    }
}

@ContextName 으로 정규화된 RoutesBuilder 빈은 Camel CDI를 통해 해당 CamelContext 빈에 자동으로 추가됩니다. 이러한 CamelContext 빈이 없는 경우 RouteAddedToBazCamelContext 빈과 같이 자동으로 생성됩니다. 이는 Camel CDI에서 제공하는 @ContextName 한정자에서만 발생합니다. 따라서 사용자 정의 @My OtherQualifier 한정자를 통해 자격을 갖춘 RouteNotAddedToAnyCamelContext 빈은 Camel 컨텍스트에 추가되지 않습니다. 예를 들어 애플리케이션 실행 중에 나중에 추가해야 할 수 있는 Camel 경로에 유용할 수 있습니다.

참고

Camel 버전 2.17.0부터 Camel CDI는 모든 종류의 CamelContext 빈(예: DefaultCamelContext)을 관리할 수 있습니다. 이전 버전에서는 CdiCamelContext 유형의 빈만 관리할 수 있으므로 확장해야합니다.

CamelContext 빈에 선언된 CDI 한정자도 해당 Camel 프리미티브를 바인딩하는 데 사용됩니다. 예를 들면 다음과 같습니다.

@Inject
@ContextName("foo")
@Uri("direct:inbound")
ProducerTemplate producerTemplate;

@Inject
@ContextName("foo")
@Uri("direct:inbound")
FluentProducerTemplate fluentProducerTemplate;

@Inject
@BarContextQualifier
MockEndpoint outbound; // URI defaults to the member name, i.e. mock:outbound

@Inject
@ContextName("baz")
@Uri("direct:inbound")
Endpoint endpoint;