Как использовать один и тот же CamelContext в нескольких банках на одной и той же войне
Я использую верблюд 2.16.2, и мне нужно использовать один CamelContext для нескольких jar, так как мне нужно, чтобы все маршрутизаторы Camel были подключены к одному CamelContext. Так что в моей войне все эти банки будут артефактами мавена.
Пожалуйста, дайте мне знать, как мне справиться с вышеуказанным сценарием?
редактировать
Просто, чтобы уточнить подробнее по вышеуказанному вопросу. В моей войне myApp.war я инициализировал CamelContext. Есть три баночки myApp1.jar, myApp2.jar и myApp3.jar. У каждой банки есть свои собственные маршрутизаторы, определенные отдельно.
- Как мне запустить роутеры в каждой банке?
- Могу ли я использовать один и тот же CamelContext для каждого маршрутизатора?
- Если я не могу справиться с помощью jar-файлов, возможно ли реализовать с несколькими войнами (myApp1.war, myApp2.war и myApp3.war), и каждая война имеет разные camelContext и связывается с этими маршрутизаторами основной войны (myApp.war)?
2 ответа
После некоторых исследований нашли способ реализовать это. Фактически мы можем использовать один и тот же CamelContext в разных банках, поскольку все банки находятся в одной и той же войне (веб-контейнер).
Мы можем легко реализовать с Apache Camel 2.16.2
с верблюдом CDI. Если вы используете wildfly для развертывания своей войны, вам может понадобиться добавить патч для верблюдов. Скачать the wildfly 9.0.2 pach
Шаги приведены ниже.
В вашей войне создайте сервлет или restService и вставьте camelContext.
@Inject
@ContextName("cdi-context")
private CamelContext camelctx;
Создайте роутер в банке с аннотацией ниже.
@Startup
@ApplicationScoped
public class MyJRouteBuilder extends RouteBuilder {
В Configure метод добавить
@Override
public void configure() throws Exception {
from("direct:startTwo").routeId("MyJRouteBuilder")
.bean(new SomeBeanThree());
}
Создайте класс BootStrap в вашем банке и добавьте маршрутизатор
@Singleton
@Startup
public class BootStrap {
private CamelContext camelctx;
@PostConstruct
public void init() throws Exception {
camelctx.addRoutes(new MyJRouteBuilder());
}
Добавьте свой кувшин в качестве артефакта в войну pom.xml. Как только вы развернете войну, вы увидите, что MyJRouteBuilder зарегистрирован в cdi-context
CamelContext
, Так что теперь вы можете получить доступ к вашему маршрутизатору где угодно.
Надеюсь, что это пригодится любому, кто имеет ту же проблему, что и я.
Как говорили другие парни, вы не можете использовать один и тот же CamelContext в разных банках. Не могли бы вы немного объяснить, что вы хотите сделать?
ИМХО, что вы хотите сделать, это использовать маршруты, определенные в разных банках. Так что для этого вы можете определить верблюжий контекст и добавить все маршруты из разных банок. Конечно, ваш Camel-Context-JAR должен иметь доступ ко всем этим банкам.
<camel:camelContext id="camel5">
<camel:package>org.apache.camel.spring.example</camel:package>
</camel:camelContext>
Или класс за классом
<camelContext id="camel5" xmlns="http://camel.apache.org/schema/spring">
<routeBuilder ref="myBuilder" />
</camelContext>
<bean id="myBuilder" class="org.apache.camel.spring.example.test1.MyRouteBuilder"/>
Или, если вы используете CDI, вы можете прочитать эту замечательную статью https://dzone.com/articles/using-camel-routes-in-java-ee-components