我正在使用akka-camel 2.2.1并且需要分别配置路由器和消费者和生产者角色。我目前正在定义路由并将它们添加到CamelExtension中的内部Camel上下文中,如下所示:
camel.context.addRoutes(new RouteBuilder {
def configure() = {
from("file:/tmp?include=whatever.*.log&noop=true&sendEmptyMessageWhenIdle=true")
.split(body(classOf[String]).tokenize("\n"))
.streaming()
.to("seda:input-route")
from("seda:update-route")
.to("bean:db-update-bean?method=process")
}})
我有一个扩展Consumer的Actor,它通过endPointUri读取“seda:input-route”,另一个扩展Producer的Actor写入“seda:update-route”。 Spring applicationContext.xml中定义的“db-update-bean”如下所示:
<bean id="db-update-bean" class="nz.co.whatever.DBUpdate">
<constructor-arg ref="jdbcTemplate"/>
<constructor-arg value="some_other_constructor_arg"/>
</bean>
Spring上下文被加载并在由akka.Main启动的主管Actor中启动。然而(并且可以理解),Camel并不知道这个Spring上下文,因此不遗余力地告诉我,它不知道“db-update-bean”是什么:
2013-10-11 08:55:09,614 [SedaConsumer] WARN处理交换时出错。交换[消息:1378642997698,27684,真实,57.000000,0.750000,97]。引起: [org.apache.camel.NoSuchBeanException - 在注册表中找不到bean:db-update-bean]
当然,我可以通过编程方式将组件添加到akka提供的CamelContext中,或者执行以下操作:
from("seda:update-route")
.bean(new DBUpdate(jdbcTemplate, "gps_temp_status"), "process")
但我宁愿用Spring来定义bean。显然,CamelExtension需要使用Spring定义的CamelContext而不是创建它自己的一个。
此外,更重要的是,我想将Camel路由的定义外部化到<CamelContext/>
标记内的同一applicationContext.xml中。根据诸如https://weblogs.java.net/blog/manningpubs/archive/2013/02/13/akka-and-camel之类的文章,似乎这样做的方法是实例化一个“camel-service”bean并注入Spring定义的CamelContext:
<camel:camelContext id="camelContext">
</camel:camelContext>
<akka:camel-service id="camelService">
<akka:camel-context ref="camelContext" />
</akka:camel-service>
这是车轮脱落的地方。根据Roland Kuhn在Why spring integration doc for akka exists only for 1.3.1 but not for next versions中的回复,akka-spring库不包含在Akka 2.2.1中,因此没有针对akka的Spring命名空间处理程序,我无法实例化这个camel-service bean。虽然不是因为缺乏尝试。或诅咒。
所以(最后),问题是:如何定义Spring XML中的Camel路由,其端点可以由使用akka-camel 2.2.1而不使用akka-spring的Consumer或Producer Actors使用?是否有人实例化一个Factory bean,它生成一个注入了CamelContext的CamelService或其他一些这样的巫术?其次(但相关)如果我被迫通过RouteBuilder定义它们,如何使用Spring来实例化在camel路由中引用的bean?
提前致谢。