Определение маршрута akka-camel 2.2.1 с использованием Spring XML

Я использую akka-camel 2.2.1, и мне нужно настроить маршруты к и от актеров Consumer и Producer соответственно. В настоящее время я определяю маршруты и программно добавляю их во внутренний контекст Camel в CamelExtension следующим образом:

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")
  }})

У меня есть Актер, который расширяет Потребителя, который читает из «seda:input-route» через его endPointUri, и другой Актер, который расширяет Producer, который пишет в «seda:update-route». "db-update-bean" определен в Spring applicationContext.xml следующим образом:

<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. Однако (и это понятно) Camel не знает об этом контексте Spring и, таким образом, сделал все возможное, чтобы сообщить мне, что он понятия не имеет, что такое «db-update-bean»:

2013-10-11 08:55:09,614 [SedaConsumer ] ПРЕДУПРЕЖДЕНИЕ Ошибка обработки обмена. Exchange[Сообщение: 1378642997698,27684,правда,57.000000,0.750000,97]. Причина: [org.apache.camel.NoSuchBeanException — в реестре не удалось найти компонент для: db-update-bean]

Конечно, я мог бы программно добавить компоненты в предоставленный akka CamelContext или сделать что-то вроде этого:

    from("seda:update-route")
      .bean(new DBUpdate(jdbcTemplate, "gps_temp_status"), "process")

но я бы предпочел использовать Spring для определения bean-компонентов. Очевидно, что CamelExtension должен использовать определенный Spring CamelContext, а не создавать свой собственный.

Кроме того, и что более важно, я хотел бы внедрить определение маршрутов Camel в тот же файл applicationContext.xml внутри тега <CamelContext/>. Согласно таким статьям, как https://weblogs.java.net/blog/manningpubs/archive/2013/02/13/akka-and-camel, кажется, что это можно сделать, создав экземпляр bean-компонента "camel-service" и внедрив Spring-определенный CamelContext как таковой:

<camel:camelContext id="camelContext">   
</camel:camelContext>

<akka:camel-service id="camelService">                             
    <akka:camel-context ref="camelContext" />
</akka:camel-service>

Вот где колеса отрываются. Согласно ответу Роланда Куна в Почему документ по интеграции Spring для akka существует только для 1.3.1, но не для следующих версий, библиотека akka-spring не включена в Akka 2.2.1, и поэтому нет Spring обработчик пространства имен для akka, и я не могу создать экземпляр этого bean-компонента службы верблюдов. Хотя не из-за отсутствия попыток. Или ругаться.

И так (наконец), вопрос: как определить маршруты Camel в Spring XML, конечные точки которых могут использоваться субъектами-потребителями или производителями с использованием akka-camel 2.2.1 без akka-spring? Можно ли создать экземпляр компонента Factory, который создает CamelService с внедренным CamelContext или каким-то другим подобным колдовством? Во-вторых (но связано), как я могу использовать Spring для создания экземпляров bean-компонентов, на которые можно ссылаться в верблюжьих маршрутах, если я вынужден определять их через RouteBuilder?

Заранее спасибо.


person nw31304    schedule 10.10.2013    source источник
comment
У меня есть вопрос stackoverflow.com/questions/16923467/ что, как я полагаю, связано с той же проблемой. Люди обсуждают, как сделать это лучше: groups.google.com/forum. /#!topic/akka-user/TrAmYLrTFKo   -  person Alvaro Rodriguez    schedule 15.02.2014
comment
Недавно я наткнулся на средство определения внешнего маршрута, появившееся в Camel 2.6: camel. apache.org/loading-routes-from-xml-files.html. Это отлично решило мою проблему, так как я просто загружаю определения маршрутов и добавляю их в DefaultContext, предоставленный akka. По крайней мере, это позволяет мне экстернализовать маршруты без необходимости изменять источник экземпляра RouteBuilder.   -  person nw31304    schedule 05.03.2014