1

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

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

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

  • 那么使用 camel-cdi 来控制骆驼上下文的开始(在 fuse 上部署为 osgi 包)的好方法是什么?

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

4

1 回答 1

2

那么使用 camel-cdi 来控制骆驼上下文的开始(在 fuse 上部署为 osgi 包)的好方法是什么?

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

@ApplicationScoped
class CustomCamelContext extends DefaultCamelContext {

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

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

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

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

Camel CDI会自动将RoutesBuilder符合条件的bean@ContextName添加到相应的bean 中。CamelContext如果不CamelContext存在这样的 bean,它将自动创建。另一方面,RoutesBuilder使用用户定义的限定符限定的 bean 不会触发任何CamelContextbean 的自动创建。这可用于在应用程序执行期间可能需要稍后添加的 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);
于 2016-10-12T09:24:10.000 回答