Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache camel 如何在同一场战争中在多个jar中使用相同的上下文_Apache Camel_Apache Camel Cdi - Fatal编程技术网

Apache camel 如何在同一场战争中在多个jar中使用相同的上下文

Apache camel 如何在同一场战争中在多个jar中使用相同的上下文,apache-camel,apache-camel-cdi,Apache Camel,Apache Camel Cdi,我正在使用camel 2.16.2,我需要跨多个jar使用one camel上下文,因为我需要将所有camel路由器都放在一个camel上下文中。所以我的战争将把所有这些罐子都当作maven的人工制品 请让我知道如何处理上述情况 编辑 我只是想对上述问题作进一步的阐述。 在我的war myApp.war中,我已经初始化了上下文。有三个jar myApp1.jar、myApp2.jar和myApp3.jar。每个jar都有自己单独定义的路由器 如何启动每个jar中的路由器 我可以使用相同的上下文注

我正在使用camel 2.16.2,我需要跨多个jar使用one camel上下文,因为我需要将所有camel路由器都放在一个camel上下文中。所以我的战争将把所有这些罐子都当作maven的人工制品

请让我知道如何处理上述情况

编辑 我只是想对上述问题作进一步的阐述。 在我的war myApp.war中,我已经初始化了上下文。有三个jar myApp1.jar、myApp2.jar和myApp3.jar。每个jar都有自己单独定义的路由器

  • 如何启动每个jar中的路由器
  • 我可以使用相同的上下文注入每个路由器吗
  • 如果我无法通过JAR处理,是否可以使用多个war(myApp1.war、myApp2.war和myApp3.war)实现,并且每个war都具有不同的上下文,并与主war(myApp.war)中的路由器通信

  • 正如其他人所说,你不能在不同的罐子中使用相同的上下文。你能解释一下你想做什么吗


    IMHO您要做的是使用在不同JAR中定义的路由。因此,您可以定义一个Camel上下文并添加来自不同jar的所有路由。当然,您的Camel上下文JAR必须能够访问所有这些JAR

     <camel:camelContext id="camel5">
      <camel:package>org.apache.camel.spring.example</camel:package>
    </camel:camelContext>
    
    
    org.apache.camel.spring.example
    
    或者一类一类地

      <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,您可以阅读这篇伟大的文章


    参考资料:

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

    我们可以使用ApacheCamel 2.16.2和Camel CDI轻松实现。如果您使用wildfly部署您的war,那么您可能需要添加驼峰补丁。下载

    步骤如下所示

    在war中,创建servlet或restService并注入上下文

    @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中创建一个引导类并添加路由器

    @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上下文中注册。所以现在你可以在任何地方访问你的路由器


    希望这对任何和我有同样问题的人都有用。

    jar不是可执行工件,你不能“在jar之间共享上下文”。但是您可以在servlet或过滤器之间的战争中共享一个实例。你应该弄清楚你真正想要的是什么。@jérémie-b哦,基本上,我有三个罐子,它们有不同类型的路线。所以我有一个war,它添加了大约三个JAR作为maven工件和不同的ejb服务。我需要的是在激活这些ejb服务时访问路由。那么,在不将它们添加到一个CamelContext的情况下,我如何处理这个问题呢?@jérémie-b-事实上,我们可以在jar之间“共享一个CamelContext”" . 我正在实施和测试这个。随后,将公布结果。#Chubutin,基本上我正在试用骆驼CDI和2.16.2。我已经浏览了你提到的链接。我能够在一场战争中部署一个camelcdi实现,并将路由器添加到同一camel上下文中,这非常有效。然而,正如我在前面的评论中所解释的,我需要知道的是,如果我在一个单独的war或jar中有一个单骆驼上下文,并且如果我的路由器在另一个jar或war中,我如何从最初的war连接到这些路由器?如何启动这些路由并连接到这些路由器?(我已经编辑了这个问题)哦,对不起,我还没有用CDI完成。您可以使用下一版本2.17.x并使用以下注释:。虽然,我不知道这是否是可用的,所以我不能说这是它的行为你有没有阅读有关该组件?它可能对你有用。你可以有多个骆驼上下文,并通过这个组件在它们之间路由消息。事实上,我并没有考虑OSGI的实现。应该有一种方法来处理Camel CDI。我将对此做一些研究。我对wildfly 10.1.0也有同样的问题。此修补程序与该修补程序不兼容,并且其中的4.8.0修补程序无法解决此问题。那么,如何在10.1.0决赛中做到这一点呢。