我正在使用 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”读取,另一个 Actor 扩展了写入“seda:update-route”的 Producer。在 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,true,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 命名空间处理程序,并且我无法实例化这个骆驼服务 bean。虽然不是因为缺乏尝试。或者诅咒。
所以(最后),问题是:如何在没有 akka-spring 的情况下使用 akka-camel 2.2.1 在 Spring XML 中定义其端点可以被消费者或生产者 Actor 使用的 Camel 路由?是否会实例化一个 Factory bean,该 bean 会产生一个带有 CamelContext 注入的 CamelService 或其他一些类似的巫术?其次(但相关)如果我被迫通过 RouteBuilder 定义它们,我如何使用 Spring 实例化要在骆驼路由中引用的 bean?
提前致谢。