camel-cdi 如何不自动启动 CamelContext 并且不自动发现 RouteBuilder

camel-cdi how to not auto start CamelContext and not auto discover RouteBuilder

在以前的项目中,我经常将 Guice 与 camel 结合使用。我的方法是扩展 Camel 的 Main class 并在那里注入我的预配置上下文。 我需要控制上下文的开始。在上下文开始之前我做了一些准备工作(例如启动 hawtio 和其他设置)。

与我对 RouteBuilder 所做的相同。一个中央 RouteBuilder 设置了诸如 onException 之类的东西,添加了 RoutePolicies 并在其他路由上配置了自动启动,当然还添加了所有其他路由。

与此同时,我学会了爱上 CDI,camel 在 2.17(和 fuse 6.3)中的 CDI 支持似乎已经完成。

So what would be a good approach with camel-cdi to control the start of camel context (deployed as osgi bundle on fuse)?

Camel CDI 始终启动自动配置的 Camel 上下文。也就是说,可以通过声明 PostConstruct 生命周期事件来自定义这些路由,例如:

@ApplicationScoped
class CustomCamelContext extends DefaultCamelContext {

    @PostConstruct
    void customize() {
        setAutoStartup(false);
    }
}

在该示例中,添加到该 Camel 上下文的路由不会随上下文一起启动。

这尊重 Camel 原则,即使用在该阶段完成的所有验证来启动上下文。然而具有不启动路由的能力。

How to disable or control autodiscovery of RouteBuilder (and or other stuff)?

@ContextName限定的RoutesBuilder个bean被Camel CDI自动添加到相应的CamelContext个bean中。如果不存在这样的 CamelContext bean,它会自动创建。另一方面,使用用户定义的限定符限定的 RoutesBuilder bean 不会触发任何 CamelContext bean 的自动创建。这可用于稍后在应用程序执行期间可能需要添加的 Camel 路由。例如:

@DoNotDiscover
class MyRouteBuilder extends RouteBuilder {
    // ...
}

如果没有明确声明使用 @DoNotDiscover 限定的 Camel 上下文 bean,则不会自动发现 MyRouteBuilder bean。它仍然可以稍后在应用程序执行期间使用,例如:

@Inject
@DoNotDiscover
Instance<RouteBuilder> routes;

@Inject
CamelContext context;

for (RouteBuilder route : routes)
    route.addRoutes(route);