59.5. 複数の Camel コンテキスト

上で説明したように、実際にはアプリケーションで任意の数の CamelContext Bean を宣言できます。その場合、これらの CamelContext Bean で宣言された CDI 修飾子は、対応する Camel コンテキストへの Camel ルートおよび他の Camel プリミティブを BIND するために使用されます。例から、次の Bean が宣言された場合:

@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 Bean は、Camel CDI によって対応する CamelContext Bean に自動的に追加されます。そのような CamelContext Bean が存在しない場合は、RouteAddedToBazCamelContext Bean の場合と同様に、自動的に作成されます。これは、Camel CDI によって提供される @ContextName 修飾子に対してのみ発生することに注意してください。したがって、ユーザー定義の @MyOtherQualifier 修飾子で修飾された RouteNotAddedToAnyCamelContext Bean は、どの Camel コンテキストにも追加されません。これは、たとえば、後でアプリケーションの実行中に追加する必要がある Camel ルートの場合に役立ちます。

注記

Camel バージョン 2.17.0 以降、Camel CDI はあらゆる種類の CamelContext Bean (例: DefaultCamelContext) を管理できます。以前のバージョンでは、タイプ CdiCamelContext の Bean しか管理できないため、拡張する必要があります。

CamelContext Bean で宣言された CDI 修飾子は、対応する Camel プリミティブを BIND するためにも使用されます。

@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;