如何在同一个 war 的多个 jar 中使用相同的 CamelContext

How to use same CamelContext in multiple jar on the same war

我正在使用 camel 2.16.2,我需要在多个 jar 中使用同一个 CamelContext,因为我需要将所有 Camel 路由器都放在同一个 CamelContext 中。所以我的 war 会将所有这些罐子作为 Maven 工件。

请告诉我如何处理上述情况?

编辑

只是为了详细说明上述问题。 在我的 war myApp.war 中,我已经初始化了 CamelContext。共有三个罐子 myApp1.jar、myApp2.jar 和 myApp3.jar。每个 jar 都有自己单独定义的路由器。

  1. 如何在每个 jar 中启动路由器?
  2. 我可以使用注入到每个路由器的相同 CamelContext 吗?
  3. 如果我无法通过 jars 处理,是否可以使用多个 war(myApp1.war、myApp2.war 和 myApp3.war)和每个 war 来实现具有不同的 camelContext 并从主 war (myApp.war) ?
  4. 与这些路由器通信

正如其他人所说,您不能在不同的 Jar 中使用相同的 CamelContext。你能解释一下你想做什么吗?


恕我直言,您要做的是使用在不同 Jar 中定义的路由。因此,为此您可以定义一个 Camel 上下文并添加来自不同 Jar 的所有路由。当然,您的 Camel-Context-JAR 必须能够访问所有这些罐子。

 <camel:camelContext id="camel5">
  <camel:package>org.apache.camel.spring.example</camel:package>
</camel:camelContext>

或 class 通过 class

  <camelContext id="camel5" xmlns="http://camel.apache.org/schema/spring">
    <routeBuilder ref="myBuilder" />    
  </camelContext>

  <bean id="myBuilder" class="org.apache.camel.spring.example.test1.MyRouteBuilder"/>

或者,如果您使用的是 CDI,则可以关注这篇很棒的文章 https://dzone.com/articles/using-camel-routes-in-java-ee-components

参考:http://camel.apache.org/spring.html

在做了一些研究之后找到了实现这个的方法。事实上,我们可以在不同的 jar 中使用相同的 CamelContext,因为所有的 jar 都在同一个 war(Web 容器)中。

我们可以使用 Apache Camel 2.16.2 和 camel CDI 轻松实现。如果您使用 wildfly 来部署 war,那么您可能需要添加 camel 补丁。下载 wildfly 9.0.2 pach

步骤如下。

在您的 war 中创建一个 servlet 或 restService 并注入 camelContext。

@Inject
@ContextName("cdi-context")
private CamelContext camelctx;

使用以下注释在 jar 中创建一个路由器。

@Startup
@ApplicationScoped
public class MyJRouteBuilder extends RouteBuilder {

在配置方法中添加

@Override
public void configure() throws Exception {
    from("direct:startTwo").routeId("MyJRouteBuilder")
    .bean(new SomeBeanThree());
}

在你的 jar 中创建一个 BootStrap Class 并添加 Router

@Singleton
@Startup
public class BootStrap {

private CamelContext camelctx;

@PostConstruct
public void init() throws Exception {   
    camelctx.addRoutes(new MyJRouteBuilder());
}

将您的 jar 添加为 war pom.xml 中的工件。部署 war 后,您可以看到 MyJRouteBuilder 已在 cdi-context CamelContext 中注册。所以现在您可以在任何地方访问您的路由器。

希望这对遇到与我相同问题的任何人有用。