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

时间:2016-10-07 07:02:09

标签: apache-camel cdi apache-camel-cdi

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

我和RouteBuilder一样。一个中央RouteBuilder设置像onException,添加RoutePolicies和在其他路由上配置自动启动,当然还添加了所有其他路由。

与此同时,我学会了爱CDI,并且2.17(和保险丝6.3)中的CDI支持似乎已经完成。

  • 那么用camel-cdi来控制驼峰上下文的开始(在保险丝上部署为osgi bundle)会有什么好方法?

  • 如何禁用或控制RouteBuilder(和/或其他东西)的自动发现?

1 个答案:

答案 0 :(得分:2)

  

那么用camel-cdi控制开始是一个很好的方法   骆驼上下文(在保险丝上部署为osgi bundle)?

Camel CDI始终启动自动配置的Camel上下文。话虽如此,通过声明PostConstruct生命周期事件,可以自定义这些路径,以便不启动路由:

@ApplicationScoped
class CustomCamelContext extends DefaultCamelContext {

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

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

这尊重Camel原则,以启动具有在该阶段完成的所有验证的上下文。但是有能力不开始路由。

  

如何禁用或控制RouteBuilder(和/或其他)的自动发现   的东西)?

使用RoutesBuilder限定的@ContextName 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);