2

我正在使用 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?

提前致谢。

4

0 回答 0