Java 已加载上下文,但路由定义为空

Java 已加载上下文,但路由定义为空,java,spring,groovy,apache-camel,applicationcontext,Java,Spring,Groovy,Apache Camel,Applicationcontext,我正在尝试从applicationContext.xml文件手动加载CamelContext,如下所示: <beans:beans xmlns="http://www.springframework.org/schema/integration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org

我正在尝试从
applicationContext.xml
文件手动加载
CamelContext
,如下所示:

<beans:beans xmlns="http://www.springframework.org/schema/integration"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xsi:schemaLocation="                                                                                                                                                                                                                                                                                              
                                 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd                                                                                                                                                                                      
                                 http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd                                                                                                                                                                    
                                 http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring">
    <route>
      <from uri="direct:a"/>
      <to uri="direct:b"/>
    </route>

    <route>
      <from uri="direct:b"/>
      <to uri="direct:c"/>
    </route>

    <route>
      <from uri="direct:c"/>
      <to uri="mock:direct:c"/>
    </route>
  </camelContext>                                                                                                                                                                                                                                                                                                              

</beans:beans>
    final Main main = new Main();
    main.setApplicationContextUri("test/integration/resources/applicationContext.xml");
    main.start();

    def ctx = main.applicationContext

    ctx.beanDefinitionNames.each { name ->
      if(name == 'camelContext'){
        def cctx = ctx.getBean(name);
        println "\nRD:" + cctx.routeDefinitions // <!-- this prints routes
      }
    }

    ctx.beanDefinitionNames.each { name ->                                                                                                                                                                                                                                                                                 
      def beanDef = ctx.beanFactory.getBeanDefinition(name);
      applicationContext.registerBeanDefinition(name, beanDef)
    }

    // TODO remove this snippets                                                                                                                                                                                                                                                                                           
    def camelContext = applicationContext.getBean("camelContext")
    applicationContext.start();
    camelContext.start();
    println "Route definitions: " + camelContext.routeDefinitions //<!-- this does not
    println "Routes: " + camelContext.routes //<!-- this does not
所有加载都很好,但是
路由
路由定义
都是空的;(

输出为:

Routes definitions: []
Routes: []
我做错了什么?或者我错过了什么

更新1

经过一些研究,我发现了以下几点。如果我修改我的XML文件并将嵌套标记更改为一些无效值(例如,将
替换为
),我马上就会出错。 但是,如果我将端点URI更改为某个无效值(例如,
mock:direct:c
替换为
mock\u XXX:direct:c
),则不会引发错误

但是,我相信Spring对模式的验证是运行的,而对路由的骆驼验证则不是

更新2

当我将
camelContext.start()
替换为
applicationContext.start()
时,没有任何变化

更新3

在提出一些建议后,我将代码更改为:

<beans:beans xmlns="http://www.springframework.org/schema/integration"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xsi:schemaLocation="                                                                                                                                                                                                                                                                                              
                                 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd                                                                                                                                                                                      
                                 http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd                                                                                                                                                                    
                                 http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring">
    <route>
      <from uri="direct:a"/>
      <to uri="direct:b"/>
    </route>

    <route>
      <from uri="direct:b"/>
      <to uri="direct:c"/>
    </route>

    <route>
      <from uri="direct:c"/>
      <to uri="mock:direct:c"/>
    </route>
  </camelContext>                                                                                                                                                                                                                                                                                                              

</beans:beans>
    final Main main = new Main();
    main.setApplicationContextUri("test/integration/resources/applicationContext.xml");
    main.start();

    def ctx = main.applicationContext

    ctx.beanDefinitionNames.each { name ->
      if(name == 'camelContext'){
        def cctx = ctx.getBean(name);
        println "\nRD:" + cctx.routeDefinitions // <!-- this prints routes
      }
    }

    ctx.beanDefinitionNames.each { name ->                                                                                                                                                                                                                                                                                 
      def beanDef = ctx.beanFactory.getBeanDefinition(name);
      applicationContext.registerBeanDefinition(name, beanDef)
    }

    // TODO remove this snippets                                                                                                                                                                                                                                                                                           
    def camelContext = applicationContext.getBean("camelContext")
    applicationContext.start();
    camelContext.start();
    println "Route definitions: " + camelContext.routeDefinitions //<!-- this does not
    println "Routes: " + camelContext.routes //<!-- this does not

路由定义似乎没有初始化或加载,或者其他什么,因此它只是空的。

您需要启动CamelContext,让它加载其路由。它看起来就像您刚刚加载SpringBean定义一样。这不会导致CamelContext触发其路由加载等。因此,它应该是空的。

起作用实际上,我从未尝试通过Groovy启动Camel-Spring上下文。在Java中,我使用
org.apache.Camel.Spring.Main
进行测试:

 final Main main = new Main();
 main.setApplicationContextUri("test/integration/resources/applicationContext.xml"); // use wildcards if needed
 main.start();

也许这是您解决问题的另一种选择。

不应该是
camelContext.routes
?不确定…From routes显示实际的路由实例,routedDefinitions仅显示定义。我已更改了代码段,请检查camelContext.start()没有帮助。我已经更改了代码段,请检查您需要启动Spring,例如applicationContext.start()这也会启动Camel。我相信我的applicationContext是在其他地方启动的。但是,尝试了你的建议-不起作用。我现在将更新我的问题。我已经再次更新了我的问题定义。请检查。正如你看到的,Camel context已启动。applicationContext也已启动。不,这不是我一直在应用的情况只需
我的上下文注入其中即可。