OSGI это название стандарта. JBoss Fuse декларирует Apache Felix в качестве реализации OSGi. Apache Karaf является подпроектом Apache Felix, он определяется как "легкий контейнер OSGi", модульная среда выполнения OSGi с открытым исходным кодом, то есть в качестве osgi в fuse используется karaf.
Существует два способа управления приложением в JBoss Fuse, зто blueprint (современный) и spring (устаревший, поэтому его я рассматривать не буду).
Настроим конфигурацию blueprint для управления приложением Apache Camel.
Выполним команду:
karaf@root()> features:install camel-blueprint
получим в файле /home/sergey/fuse/data/log/fuse.log записи об активации нового функционала, 4 строки:
2021-02-13 17:19:57,724 | INFO | eature:install $args | o.a.k.f.i.s.FeaturesServiceImpl | 13 - org.apache.karaf.features.core - 4.2.9.fuse-780023-redhat-00001 | The specified feature: 'camel-blueprint' version '2.23.2.fuse-780036-redhat-00001' is already installed
2021-02-13 17:19:57,726 | INFO | eature:install $args | o.a.k.f.i.s.FeaturesServiceImpl | 13 - org.apache.karaf.features.core - 4.2.9.fuse-780023-redhat-00001 | Adding features: camel-blueprint/[2.23.2.fuse-780036-redhat-00001,2.23.2.fuse-780036-redhat-00001]
2021-02-13 17:20:01,052 | INFO | features-2-thread-1 | o.a.k.f.i.s.FeaturesServiceImpl | 13 - org.apache.karaf.features.core - 4.2.9.fuse-780023-redhat-00001 | No deployment change.
2021-02-13 17:20:01,088 | INFO | features-2-thread-1 | o.a.k.f.i.s.FeaturesServiceImpl | 13 - org.apache.karaf.features.core - 4.2.9.fuse-780023-redhat-00001 | Done.
Из лога следует, что бандл camel-blueprint уже установлен. Теперь доступно управление функционалом маршрутизации и посредничества приложения Apache Camel с помощью конфигурационных файлов blueprint. Функции времени выполнения, предоставляемые JBoss Fuse, включают функции горячего развертывания, управления и администрирования (терпение, эта тема будет объяснена немного позже). Пока разберемся с горячим развертыванием маршрутизации и посредничества.
Условие возможности горячего развертывания маршрутизации и посредничества - обязательно должен быть включен контейнер Karaf (сервер JBoss Fuse должен находиться в рабочем состоянии). Нельзя манипулировать файлами blueprint в папке deploy если сервер JBoss Fuse выключен, чтобы всё не поломалось. Нельзя там ничего добавлять, изменять и удалять. При выключенном контейнере Karaf горячее развертывание маршрутизации и посредничества недоступно, требуемые функции не будут сами включаться и выключаться, прийдется манипулировать настройками, модулями и пакетами вручную, чего мы пока не умеем делать. Если лог перестал реагировать на Ваши действия в каталоге deploy, корректно (описано в данной статье) перезапустите сервер red hat fuse. Сделайте в терминале shutdown и сразу же запустите sh fuse.
Реализуем пример горячего развертывания маршрутизации и посредничества.
2021-02-13 17:19:57,724 | INFO | eature:install $args | o.a.k.f.i.s.FeaturesServiceImpl | 13 - org.apache.karaf.features.core - 4.2.9.fuse-780023-redhat-00001 | The specified feature: 'camel-blueprint' version '2.23.2.fuse-780036-redhat-00001' is already installed
2021-02-13 17:19:57,726 | INFO | eature:install $args | o.a.k.f.i.s.FeaturesServiceImpl | 13 - org.apache.karaf.features.core - 4.2.9.fuse-780023-redhat-00001 | Adding features: camel-blueprint/[2.23.2.fuse-780036-redhat-00001,2.23.2.fuse-780036-redhat-00001]
2021-02-13 17:20:01,052 | INFO | features-2-thread-1 | o.a.k.f.i.s.FeaturesServiceImpl | 13 - org.apache.karaf.features.core - 4.2.9.fuse-780023-redhat-00001 | No deployment change.
2021-02-13 17:20:01,088 | INFO | features-2-thread-1 | o.a.k.f.i.s.FeaturesServiceImpl | 13 - org.apache.karaf.features.core - 4.2.9.fuse-780023-redhat-00001 | Done.
Развернем файл конфигурации напрямую, скопировав его в следующий каталог горячего развертывания
InstallDir/deploy
в данном случае фактически это
/home/sergey/fuse/deploy
Следующий конфигурационный файл ExampleRouter.xml будучи положен в каталог deploy сразу активирует генерацию тестового сообщения каждые две секунды.
конфигурационный файл ExampleRouter.xml
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<manifest xmlns="http://karaf.apache.org/xmlns/deployer/blueprint/v1.0.0">
Bundle-Version = 1.2.3.4
</manifest>
<camelContext xmlns="http://camel.apache.org/schema/blueprint">
<route>
<from uri="timer://myTimer?fixedRate=true&period=2000"/>
<to uri="log:ExampleRouter"/>
</route>
</camelContext>
</blueprint>
Просто положите его на несколько секунд в каталог горячего развертывания, а затем уберите оттуда (то есть отмените горячее развертывание).
Снова откроем файл /home/sergey/fuse/data/log/fuse.log и прочитаем записи о срабатывании генерации сообщений по таймеру.
Лог-файл о срабатывании генерации тестовых сообщений
2021-02-13 21:03:29,896 | INFO | e/sergey/fuse/deploy | o.a.f.fileinstall | 11 - org.apache.felix.fileinstall - 3.6.4 | Installing bundle ExampleRouter.xml / 1.2.3.4
2021-02-13 21:03:30,169 | INFO | e/sergey/fuse/deploy | o.a.a.b.c.BlueprintContainerImpl | 53 - org.apache.aries.blueprint.core - 1.10.2 | Blueprint bundle ExampleRouter.xml/1.2.3.4 has been started
2021-02-13 21:03:30,170 | INFO | Event Dispatcher: 1 | o.a.c.b.BlueprintCamelContext | 62 - org.apache.camel.camel-blueprint - 2.23.2.fuse-780036-redhat-00001 | Attempting to start CamelContext: camel-2
2021-02-13 21:03:30,178 | INFO | Event Dispatcher: 1 | o.a.c.b.BlueprintCamelContext | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Apache Camel 2.23.2.fuse-780036-redhat-00001 (CamelContext: camel-2) is starting
2021-02-13 21:03:30,178 | INFO | Event Dispatcher: 1 | .a.c.m.ManagedManagementStrategy | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | JMX is enabled
2021-02-13 21:03:31,554 | INFO | Event Dispatcher: 1 | o.a.c.b.BlueprintCamelContext | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
2021-02-13 21:03:31,593 | INFO | Event Dispatcher: 1 | o.a.c.b.BlueprintCamelContext | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Route: route2 started and consuming from: timer://myTimer?fixedRate=true&period=2000
2021-02-13 21:03:31,600 | INFO | Event Dispatcher: 1 | o.a.c.b.BlueprintCamelContext | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Total 1 routes, of which 1 are started
2021-02-13 21:03:31,601 | INFO | Event Dispatcher: 1 | o.a.c.b.BlueprintCamelContext | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Apache Camel 2.23.2.fuse-780036-redhat-00001 (CamelContext: camel-2) started in 1.426 seconds
2021-02-13 21:03:31,612 | INFO | e/sergey/fuse/deploy | o.a.f.fileinstall | 11 - org.apache.felix.fileinstall - 3.6.4 | Started bundle: blueprint:file:/home/sergey/fuse/deploy/ExampleRouter.xml
2021-02-13 21:03:32,601 | INFO | #3 - timer://myTimer | ExampleRouter | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]]
2021-02-13 21:03:34,601 | INFO | #3 - timer://myTimer | ExampleRouter | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]]
2021-02-13 21:03:36,601 | INFO | #3 - timer://myTimer | ExampleRouter | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]]
2021-02-13 21:03:38,601 | INFO | #3 - timer://myTimer | ExampleRouter | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]]
2021-02-13 21:03:40,601 | INFO | #3 - timer://myTimer | ExampleRouter | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]]
2021-02-13 21:03:42,600 | INFO | #3 - timer://myTimer | ExampleRouter | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]]
2021-02-13 21:03:44,600 | INFO | #3 - timer://myTimer | ExampleRouter | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]]
2021-02-13 21:03:45,620 | INFO | e/sergey/fuse/deploy | o.a.f.fileinstall | 11 - org.apache.felix.fileinstall - 3.6.4 | Uninstalling bundle 254 (ExampleRouter.xml)
2021-02-13 21:03:45,621 | INFO | e/sergey/fuse/deploy | o.a.a.b.c.BlueprintExtender | 53 - org.apache.aries.blueprint.core - 1.10.2 | Destroying container for blueprint bundle ExampleRouter.xml/1.2.3.4
2021-02-13 21:03:45,624 | INFO | e/sergey/fuse/deploy | o.a.c.b.BlueprintCamelContext | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Apache Camel 2.23.2.fuse-780036-redhat-00001 (CamelContext: camel-2) is shutting down
2021-02-13 21:03:45,626 | INFO | e/sergey/fuse/deploy | o.a.c.i.DefaultShutdownStrategy | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Starting to graceful shutdown 1 routes (timeout 300 seconds)
2021-02-13 21:03:45,629 | INFO | ad #4 - ShutdownTask | o.a.c.i.DefaultShutdownStrategy | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Route: route2 shutdown complete, was consuming from: timer://myTimer?fixedRate=true&period=2000
2021-02-13 21:03:45,634 | INFO | e/sergey/fuse/deploy | o.a.c.i.DefaultShutdownStrategy | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Graceful shutdown of 1 routes completed in 0 seconds
2021-02-13 21:03:45,650 | INFO | e/sergey/fuse/deploy | o.a.c.b.BlueprintCamelContext | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Apache Camel 2.23.2.fuse-780036-redhat-00001 (CamelContext: camel-2) uptime 15.475 seconds
2021-02-13 21:03:45,651 | INFO | e/sergey/fuse/deploy | o.a.c.b.BlueprintCamelContext | 64 - org.apache.camel.camel-core - 2.23.2.fuse-780036-redhat-00001 | Apache Camel 2.23.2.fuse-780036-redhat-00001 (CamelContext: camel-2) is shutdown in 0.027 seconds
Первый пример сработал. Этот лог можно видеть в графической консоли hawtio которая дает преимущество к управлению удаленно по http

Теперь я сделал отбор по событию в логе и увидел конкретно свой протестированный функционал.

Теперь под спойлером немного теории для понимания принципов работы данного механизма.
-
«Red Hat JBoss Fuse» - слой оболочки вокруг реализации контейнера OSGi, обеспечивающий поддержку развертывания контейнера OSGi в качестве сервера времени выполнения.
-
Технология OSGi это система динамических модулей для Java, которая использует пакеты для модульного развертывания компонентов Java и обработки зависимостей, управления версиями, управления путями к классам и загрузки классов.

1) Пакеты (бандлы) показаны белым цветом на рисунке - логические модули, составляющие приложение.
2) Уровень обслуживания (голубым цветом показаны службы) - обеспечивает связь между модулями и содержащимися в них компонентами. Этот уровень тесно интегрирован со слоем жизненного цикла.
3) Уровень жизненного цикла (оранжевый цвет) - обеспечивает доступ к базовой структуре OSGi. Этот уровень управляет жизненным циклом отдельных пакетов, поэтому вы можете управлять своим приложением динамически, включая запуск и остановку пакетов.
4) Уровень модуля (зеленый) - предоставляет API для управления упаковкой пакетов, разрешением зависимостей и загрузкой классов.
5) Среда выполнения (розовый) - конфигурация JVM. Эта среда использует профили, которые определяют среду, в которой могут работать пакеты.
6) Уровень безопасности (аквамарин) - дополнительный уровень, основанный на безопасности Java 2, с дополнительными ограничениями и улучшениями.
Выполнив в терминале в запущенном karaf команду list -u мы получим список приложений (пакетов) с которыми мы можем взаимодействовать.
karaf@root()> list -u
В выводе команды list есть псевдографика, которую не может показать Инфостарт, но табличка все равно понятная. В этом списке есть и пакет camel-blueprint (последняя строка в приложенной вырезке) который мы недавно пытались установить.
Результат выполнения команды list -u
karaf@root()> list -u
START LEVEL 100 , List Threshold: 50
ID ^74; State ^74; Lvl ^74; Version ^74; Update location
^72;^72;^72;^72;_32;^72;^72;^72;^72;^72;^72;^72;^72;_32;^72;^72;^72;^72;^72;_32;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;_32;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;^72;
27 ^74; Active ^74; 80 ^74; 7.8.0.fuse-780038-redhat-00001 ^74; mvn:org.jboss.fuse.modules/fuse-pax-transx-tm-narayana/
29 ^74; Active ^74; 80 ^74; 2.0.0.fuse-sb2-780022-redhat-00001 ^74; mvn:io.hawt/hawtio-log/2.0.0.fuse-sb2-780022-redhat-000
30 ^74; Active ^74; 80 ^74; 2.0.0.fuse-sb2-780022-redhat-00001 ^74; mvn:io.hawt/hawtio-log-osgi/2.0.0.fuse-sb2-780022-redha
31 ^74; Active ^74; 80 ^74; 2.0.0.fuse-sb2-780022-redhat-00001 ^74; mvn:io.hawt/hawtio-osgi/2.0.0.fuse-sb2-780022-redhat-00
32 ^74; Active ^74; 80 ^74; 2.0.0.fuse-sb2-780022-redhat-00001 ^74; mvn:io.hawt/hawtio-osgi-jmx/2.0.0.fuse-sb2-780022-redha
37 ^74; Active ^74; 80 ^74; 2.0.30.SP4-redhat-00001 ^74; mvn:io.undertow/undertow-core/2.0.30.SP4-redhat-00001
38 ^74; Active ^74; 80 ^74; 2.0.30.SP4-redhat-00001 ^74; mvn:io.undertow/undertow-servlet/2.0.30.SP4-redhat-00001
39 ^74; Active ^74; 80 ^74; 2.0.30.SP4-redhat-00001 ^74; mvn:io.undertow/undertow-websockets-jsr/2.0.30.SP4-redh
41 ^74; Active ^74; 80 ^74; 1.2.0 ^74; mvn:javax.enterprise/cdi-api/1.2
42 ^74; Active ^74; 80 ^74; 1.2 ^74; mvn:javax.interceptor/javax.interceptor-api/1.2
45 ^74; Active ^74; 80 ^74; 1.2 ^74; mvn:javax.transaction/javax.transaction-api/1.2
47 ^74; Active ^74; 80 ^74; 1.1 ^74; mvn:javax.websocket/javax.websocket-api/1.1
48 ^74; Active ^74; 80 ^74; 1.1.2.Final ^74; mvn:org.jboss.classfilewriter/jboss-classfilewriter/1.1
62 ^74; Active ^74; 50 ^74; 2.23.2.fuse-780036-redhat-00001 ^74; mvn:org.apache.camel/camel-blueprint/2.23.2.fuse-780036
...
Список пакетов так же доступен в hawtio

В этом списке колонка №1 (ID) Айди является гиперссылкой, жмакнув на которую можно видеть подробную информацию о пакете и управлять им.

Управлять бандлами можно в терминале karaf. Пакет активируется (с помощью команды, osgi:start
) или деактивируется (с помощью команды osgi:stop
).
Где находятся файлы конфигурации установленных пакетов fuse чтобы ознакомиться с ними мы тоже можем видеть в графической консоли hawtio

В следующем выпуске мы будем манипулировать бандлами репозитория Maven, попытаемся в файле конфигурации манипулировать свойствами приложения (переменными), передавать их в приложение.
В демонстрационных видео специалисты Ред Хат рекомендуют к прочтению книгу "Шаблоны интеграции корпоративных приложений" (автоты Грегор Хоп, Бобби Вульф) которая есть на русском языке.