Статьи

Apache Camel в мире IoT: компонент «Затмение Куры»

Eclipse Kura  — это основанная на OSGi инфраструктура, предназначенная для 
 шлюзов
M2M на основе небольших вычислительных платформ, таких как 
Raspberry Pi  или 
BeagleBoard Black . Если вы планируете использовать Kura в своем шлюзе M2M и в то же время хотите воспользоваться богатым набором компонентов 
Apache Camel  и его 
возможностями EIP , то 
компонент Camel Kura  — это то, что вам нужно. Компонент Camel Kura будет доступен начиная с версии Camel 2.15.0.

Верблюжий Кура архитектура

Распространенной причиной развертывания маршрутов Camel в Eclipse Kura является предоставление корпоративных шаблонов интеграции и компонентов Camel в шлюз обмена сообщениями M2M. Например, вы можете установить Kura на Raspberry PI, затем прочитать температуру с датчика, подключенного к этому Raspberry PI, с использованием сервисов Kura и, наконец, передать текущее значение температуры в сервис вашего центра обработки данных, используя Camel EIP и компоненты. На диаграмме ниже показана архитектура решения Camel, развернутого в Eclipse Kura: 

Как я могу активировать свой маршрут?

Связки, развернутые в Eclipse Kura, обычно  разрабатываются как активаторы связок . Таким образом, самый простой способ развертывания маршрутов Apache Camel в Kura — создать пакет OSGi, содержащий класс расширения  org.apache.camel.kura.KuraRouter класса:

public class MyKuraRouter extends KuraRouter {
  @Override
    public void configure() throws Exception {
    from("timer:trigger").
      to("netty-http:http://app.mydatacenter.com/api");
  }
}

Имейте в виду, что он 
KuraRouter реализует 
org.osgi.framework.BundleActivator интерфейс, поэтому вам нужно зарегистрировать его 
 методы
start и 
stopметоды жизненного цикла при 
создании класса компонента пакета Kura . Маршрутизатор Kura запускает собственную OSGi-осведомленную 
CamelContext. Это означает, что для каждого расширяющегося класса 
KuraRouterбудет выделенный 
CamelContext экземпляр. В идеале мы рекомендуем развертывать по одному 
KuraRouter на комплект OSGi.

Как я могу развернуть свой KuraRouter

Пакет, содержащий ваш класс маршрутизатора Kura, должен импортировать следующие пакеты в манифесте OSGi:

 

Import-Package: org.osgi.framework;version="1.3.0",
org.slf4j;version="1.6.4",
org.apache.camel,org.apache.camel.impl,org.apache.camel.core.osgi,org.apache.camel.builder,org.apache.camel.model,
org.apache.camel.component.kura

Имейте в виду, что вам не нужно импортировать каждый комплект компонентов Camel, который вы планируете использовать в своих маршрутах, поскольку компоненты Camel определяются как сервисы на уровне среды выполнения. Перед развертыванием комплекта маршрутизатора убедитесь, что вы развернули (и запустили) следующие комплекты ядра Camel (используя оболочку Kura GoGo) …

install file:///home/user/.m2/repository/org/apache/camel/camel-core/2.15.0/camel-core-2.15.0.jar
start <camel-core-bundle-id>
install file:///home/user/.m2/repository/org/apache/camel/camel-core-osgi/2.15.0/camel-core-osgi-2.15.0.jar
start <camel-core-osgi-bundle-id>
install file:///home/user/.m2/repository/org/apache/camel/camel-kura/2.15.0/camel-kura-2.15.0.jar
start <camel-kura-bundle-id>

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

install file:///home/user/.m2/repository/org/apache/camel/camel-stream/2.15.0/camel-stream-2.15.0.jar
start <camel-stream-bundle-id>

Затем, наконец, разверните комплект маршрутизатора:

install file:///home/user/.m2/repository/com/example/myrouter/1.0/myrouter-1.0.jar
start <your-bundle-id>

Некоторые утилиты KuraRouter, которые сделают вашу жизнь проще

Базовый класс маршрутизатора Kura предоставляет множество полезных утилит. Давайте рассмотрим некоторые из них.

Регистратор SLF4J

Kura использует фасад SLF4J для каротажа. Защищенный член 
log возвращает экземпляр регистратора SLF4J, связанный с данным маршрутизатором Kura.

public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        log.info("Configuring Camel routes!");
        ...
    }

}

BundleContext 


Защищенный элемент 
bundleContext возвращает контекст пакета, связанный с данным маршрутизатором Kura.

public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        ServiceReference serviceRef = bundleContext.getServiceReference(LogService.class.getName());
        MyService myService = content.getService(serviceRef);
        ...
    }

}

Защищенный элемент 
CamelContext
camelContext  является 
CamelContext ассоциированным с данным маршрутизатором Kura.

public class MyKuraRouter extends KuraRouter {

    @Override
    public void configure() throws Exception {
        camelContext.getStatus();
        ...
    }

}

Средство распознавания службы

OSGi Средство распознавания службы OSGi (
service(Class serviceType)) можно использовать для простого извлечения службы по типу из контекста пакета OSGi.

public class MyKuraRouter extends KuraRouter {




    @Override
    public void configure() throws Exception {
        MyService myService = service(MyService.class);
        ...
    }




}

Как я могу настроить CamelContext, используемый KuraRouter?

Маршрутизатор Kura поставляется с обратными вызовами жизненного цикла, которые можно использовать для настройки работы маршрутизатора Camel. Например, чтобы настроить 
CamelContext экземпляр, связанный с маршрутизатором, непосредственно перед его запуском, переопределите 
beforeStartметод 
KuraRouter класса:

public class MyKuraRouter extends KuraRouter {

  ...

  protected void beforeStart(CamelContext camelContext) {
    OsgiDefaultCamelContext osgiContext = (OsgiCamelContext) camelContext;
    osgiContext.setName("NameOfTheRouter");
  }

}

Что дальше?

Текущая версия компонента Camel Kura предоставляет некоторые полезные утилиты и упрощает развертывание Camel в Kura, предоставляя продуманный маршрутизатор Camel. Однако все еще есть место для улучшений в отношении функциональности Camel Kura. Например, я могу представить предопределенные компоненты Camel, предоставляющие потребителям / производителям услуги устройств, предоставляемые Kura. Или предопределенные выражения Camel, которые можно использовать для выполнения 
маршрутизации на  основе содержимого на основе данных, считанных с датчиков Raspberry Pi. Я планирую добавить больше функций для Camel Kura в следующих выпусках Camel. Помните также, что мы очень 
любим участников  сообщества Apache Camel — если вы думаете, что у вас есть что-то, что можно добавить в Camel Kura, просто напишите мне!