Я использую 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?
Заранее спасибо.