#java #apache-camel #apache-karaf #karaf #blueprint-osgi
#java #apache-camel #apache-karaf #karaf #схема-osgi
Вопрос:
Я занят тем, что разбираюсь с Camel и Karaf. Я создал проект с двумя пакетами:
- Пакет A содержит схему верблюжьего маршрута
- Пакет B содержит чистый маршрут Java
Я следовал инструкциям из кулинарной книги Karaf Джейми Гудиера
Оба маршрута очень просты, и я развертываю их с помощью файла функций. Они отлично развертываются, а также выполняются точно так, как планировалось:
Пакет A перемещает файлы из /tmp/in
в /tmp/out
Пакет B перемещает файлы из /tmp/in2
в tmp/out2
Все хорошо.
Однако, если я выполняю команду Karaf camel:route-list
, отображается только схема маршрута
Кроме того, если я запускаю camel:context-list
, отображается только контекст, определенный в пакете A.
Просто чтобы повторить, оба маршрута работают правильно, просто Java-маршруты не отображаются в списке.
Я что-то здесь упускаю?
Вот мой маршрут Java:
public class FileRouter extends RouteBuilder {
public void configure()
{
from ("file:/tmp/in2?noop=true")
.log("Java DSL doing the heavy lifting")
.to("file:/tmp/out2");
}
}
И активатор пакета:
public class Activator implements BundleActivator {
DefaultCamelContext camelContext;
public void start(BundleContext context) {
System.out.println("Starting the bundle");
camelContext = new DefaultCamelContext();
try {
camelContext.setName("JavaDSLContext");
camelContext.addRoutes(new FileRouter());
camelContext.start();
} catch (Exception ex) {
System.out.println("Exception occured! " ex.getMessage());
}
}
public void stop(BundleContext context) {
System.out.println("Stopping the bundle");
if (camelContext != null) {
try {
camelContext.stop();
} catch (Exception ex) {
System.out.println("Exception occured during stop context.");
}
}
}
}
Комментарии:
1. Развернут ли Java route как пакет? Или вы каким-то образом завернули?
2. Кстати, я считаю, что самый простой способ работать с Karaf и Camel — использовать blueprint только для подключения RouteBuilder, а затем вся реализация находится в фактическом java route dsl. Это упрощает подключение Camel к Karaf.
3. Это зависит от того, как реализован ваш пакет Java. Когда вы делаете это вручную в OSGi, вам нужно самостоятельно настроить кучу вещей, которые вы в противном случае получаете бесплатно с помощью camel-blueprint, camel-cdi или camel-scr, которые все могут запускаться в OSGi.
4. Спасибо за комментарии всем. Я добавлю еще несколько деталей в исходный вопрос. Но вкратце: да, маршрут настроен в пакете, который настраивает camelcontext в активаторе.
5. После дальнейшего изучения я теперь могу подтвердить, что я точно развертываю код Джейми: github.com/jgoodyear/ApacheKarafCookbook/tree/master/chapter2 / … и возникают те же результаты. Маршрут работает, но не указан в camel:route-list
Ответ №1:
Спасибо за поддержку Eqdam Rashti. Сегодня утром я просмотрел ваш блог, чтобы понять, что вы имели в виду, используя blueprint с JavaDSL.
Работает как шарм.
Просто для полноты картины, вот изменение:
Мой класс Java Route остается точно таким же, как указано в вопросе, но я полностью удаляю активатор, заменяя его файлом схемы.
Затем схема выглядит следующим образом:
<bean id="FileRouter" class="com.eightbitplatoon.learning.karaf.karafbasics.combined.FileRouter">
</bean>
<camelContext id="karafbasics-combined" xmlns="http://camel.apache.org/schema/blueprint">
<routeBuilder ref="FileRouter" />
</camelContext>
Спасибо за помощь!
Комментарии:
1. Круто, рад, что блог каким-то образом помог!
Ответ №2:
И благодаря Клаусу — я проработал материал по Camel-SCR и в конечном итоге заставил этот подход работать. Я думаю, что Camel-SCR, вероятно, является более чистым решением, потому что это позволяет очень легко передавать свойства маршрутизатору JavaDSL.
Вот мое окончательное решение, для полноты картины, тогда я закрою этот вопрос: файловый маршрутизатор теперь выглядит так:
public class ScrFileRouter extends RouteBuilder {
// Configured fields
private String camelRouteId;
@Override
public void configure() throws Exception {
// Add a bean to Camel context registry
AbstractCamelRunner.getRegistry(getContext(), SimpleRegistry.class).put("testString", "this is a test");
from("file:/tmp/in6?noop=true").routeId(camelRouteId)
.to("file:/tmp/out6");
}
}
И Camel runner на основе SCR выглядит следующим образом:
@Component(label = ScrRunner.COMPONENT_LABEL, description = ScrRunner.COMPONENT_DESCRIPTION, immediate = true, metatype = true)
@Properties({
@Property(name = "camelContextId", value = "scr-runner"),
@Property(name = "camelRouteId", value = "scr-file-router"),
@Property(name = "active", value = "true"),
})
@References({
@Reference(name = "camelComponent",referenceInterface = ComponentResolver.class,
cardinality = ReferenceCardinality.MANDATORY_MULTIPLE, policy = ReferencePolicy.DYNAMIC,
policyOption = ReferencePolicyOption.GREEDY, bind = "gotCamelComponent", unbind = "lostCamelComponent")
})
public class ScrRunner extends AbstractCamelRunner {
public static final String COMPONENT_LABEL = "ScrRunner";
public static final String COMPONENT_DESCRIPTION = "This is the description for ScrRunner";
@Override
protected List<RoutesBuilder> getRouteBuilders() {
List<RoutesBuilder> routesBuilders = new ArrayList<>();
routesBuilders.add(new ScrFileRouter());
return routesBuilders;
}
@Override
protected void setupCamelContext(BundleContext bundleContext, String camelContextId)throws Exception{
super.setupCamelContext(bundleContext, camelContextId);
// Use MDC logging
getContext().setUseMDCLogging(true);
// Use breadcrumb logging
getContext().setUseBreadcrumb(true);
}
}
Я внимательно следил за информацией на веб-сайте Camel SCR и почти все заработало. Затем я использовал предложенный архетип (camel-archetype-scr), который отлично сработал.
Итак, в конце мне также пришлось внести некоторые изменения в мой POM-файл (фактически просто используя POM, предоставленный Archetype.)
Спасибо всем за помощь. Я думаю, что теперь я смогу немного поработать.
Приветствия!