Karaf camel: список маршрутов показывает только схемы маршрутов, а не маршруты Java

#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.)

Спасибо всем за помощь. Я думаю, что теперь я смогу немного поработать.

Приветствия!