【发布时间】:2014-03-07 20:11:49
【问题描述】:
我正在尝试从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>
加载时我正在使用这个 sn-ps(groovy 代码):
def xmlBeans = applicationContext.getBeanFactory()
new XmlBeanDefinitionReader(xmlBeans).loadBeanDefinitions('test/integration/resources/applicationContext.xml')
def camelContext = applicationContext.getBean("camelContext")
camelContext.start();
println "Route definitions: " + camelContext.routeDefinitions
println "Routes: " + camelContext.routes
一切正常,但routes 和routeDefinitions 是空的;(
输出是:
Routes definitions: []
Routes: []
我做错了什么?或者我错过了什么?
更新 1
经过一番研究,我发现了以下内容。如果我修改我的 XML 文件并将嵌套标记更改为某个无效值(例如,将 <from> 替换为 <from1>)我会立即收到错误消息。
但是,如果我将端点 URI 更改为某个无效值(例如,mock:direct:c 替换为 mock_XXX:direct:c) - 不会引发错误。
我相信 Spring 的模式验证可以运行,但是路线的骆驼验证不会。
更新 2
当我将 camelContext.start() 替换为 applicationContext.start() 时,没有任何变化。
更新 3
经过一些建议后,我将代码更改为:
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
第一个输出按预期打印路线。第二个输出没有。如下:
RD:[Route(a)[[From[direct:a]] -> [To[direct:b]]], Route(b)[[From[direct:b]] -> [To[direct:c]]], Route(c)[[From[direct:c]] -> [To[mock:direct:c]]]]
Route definitions: []
Routes: []
似乎路由定义不知何故没有初始化或加载,或者其他什么,因此它只是空的。
【问题讨论】:
-
不应该是
camelContext.routes吗?不确定... -
Routes 显示实际的路由实例,routeDefinitions 仅显示定义。
-
sn-ps代码我改了,请查收
标签: java spring groovy apache-camel applicationcontext