60.5. 多个 Camel 上下文
实际可在应用程序中声明任意数量的 CamelContext
Bean,如上文所述。在这种情况下,使用这些 CamelContext
Bean 上声明的 CDI 限定符用于将 Camel 路由和其他 Camel 原语绑定到对应的 Camel 上下文。在示例中,如果声明了以下 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
限定符。因此,RouteNotAddedToAnyCamelContext
bean 与用户定义的 @MyOtherQualifier
限定符不会添加到任何 Camel 上下文。例如,这非常有用,例如,在应用程序执行过程中可能需要添加的 Camel 路由。
自 Camel 版本 2.17.0 起,Camel CDI 能够管理任何类型的 CamelContext
Bean (如 DefaultCamelContext
)。在以前的版本中,它只能管理类型为 CdiCamelContext
的 Bean,因此需要扩展它。
CamelContext
Bean 上声明的 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;