Статьи

Создайте кластерную службу с помощью Конфигурации Admin и Apache Karaf Cellar.

Вступление

Изначально это было краткое введение в тему в названии и возможность познакомиться с погребом Apache Karaf. К сожалению, я не мог закончить тему до сегодняшнего дня, потому что у меня были некоторые неожиданные проблемы. Так что в основном это будет пост о проблемах, с которыми я столкнулся. В конце вы найдете TL; DR; если вы просто хотите начать.

Краткое введение в службу администрирования конфигурации

Из вики OSGi: «Администратор конфигурации — это сервис, который позволяет передавать информацию о конфигурации в компоненты для их инициализации, без зависимости от того, где и как эта информация о конфигурации хранится.» ( Http: //wiki.osgi. org / wiki / Configuration_Admin )

В основном вы пишете свойство значения ключа и сервис, который может его использовать. Все «волшебство» выполняется ConfigurationAdminService, который является частью спецификации OSGi Compendium. Хорошее введение можно найти  здесь . Также админ будет хранить его где-то для вас.

Краткое введение в погреб Apache Karaf

Взято с веб-сайта Cellar: «Cellar — это кластерное решение для Apache Karaf на основе Hazelcast. Cellar позволяет управлять кластером экземпляров Karaf, обеспечивая синхронизацию между экземплярами». ( Http://karaf.apache.org/index/subprojects /cellar.html )

Мне понравилась идея предоставить сервис для одного экземпляра Karaf и видеть, что он появляется в каждом экземпляре кластера. Особенно сочетание с MangedServiceFactory  кажется отличной идеей.

Подробнее о подвале читайте  здесь .

Настройте свой Apache Karaf

В качестве примера я хочу использовать свой MangedProcessEngineFactory из версии 1.1.0-SNAPSHOT камуфанды BPM OSGi. Вы можете просто клонировать репозиторий на GitHub  и создать его с помощью  mvn install.

Поскольку я довольно ленив, я запустил два экземпляра Karaf на своем ноутбуке. Если вы хотите сделать это, вам придется изменить некоторые номера портов для второго экземпляра Karaf. Во-первых, порты в  etc/org.apache.karaf.management.cfg:

rmiRegistryPort
rmiServerPort

Второй порт SSH в  etc/org.apache.karaf.shell.cfg (забыв, это вызвало у меня  некоторые проблемы ). Затем мы должны установить Cellar на каждый экземпляр Karaf. Поскольку мы хотим использовать текущую версию, мы будем использовать версию 3.0.1 Cellar. Вы можете найти общее руководство по установке  здесь  для получения инструкций по установке и запуску. В основном вам просто нужно позвонить с консоли Караф

feature:repo-add mvn:org.apache.karaf.cellar/apache-karaf-cellar/3.0.1/xml/features
feature:install cellar

Если вы как-то планируете построить Cellar самостоятельно, я рекомендую закомментировать модуль «samples» в корневом POM. Все ваши экземпляры Karaf должны обнаруживать друг друга автоматически. Теперь нам нужно установить и поделиться функцией camunda (или с тем, что вы хотите использовать) в кластере.

Установить и поделиться функцией

Для выполнения этой задачи у нас есть два варианта. Можно было бы активировать слушателей в каждом экземпляре Karaf и использовать «базовые» команды. Поэтому вам нужно будет установить значение слушателя пакета в значение  org.apache.karaf.cellar.node.cfg true (другие в этом примере нам не понадобятся):

bundle.listener = true
config.listener = false
feature.listener = false

Другим выбором будет использование  cluster:* команд. Оба будут (должны) давать один и тот же результат, поэтому выбирайте то, что вы предпочитаете.

Как я уже говорил, если вы предпочитаете первый вариант (слушатели), вы можете просто установить все как обычно, потому что кластер синхронизирует каждое изменение:

feature:repo-add mvn:org.camunda.bpm.extension.osgi/camunda-bpm-karaf-feature/1.1.0-SNAPSHOT/xml/features
feature:install camunda-bpm-karaf-feature-minimal

(Обратите внимание, что мой пример проекта должен быть установлен локально, чтобы использовать его)

(Также обратите внимание, что в настоящее время в camunda feature.xml есть ошибка. Вам нужно изменить версию camunda-connect-core на 1.0.0-alpha3, чтобы она работала)

Если вы хотите использовать «версии кластера» этих команд, вы должны ввести:

cluster:feature-repo-add default mvn:org.camunda.bpm.extension.osgi/camunda-bpm-karaf-feature/1.1.0-SNAPSHOT/xml/features
cluster:feature-install default camunda-bpm-karaf-feature-minimal

Эти команды работают как основные, но вы всегда должны указывать группу.

Вы должны увидеть, что эта функция установлена ​​в обоих экземплярах Karaf (проверьте, например, с помощью: list | grep -i camunda). Теперь нам нужна база данных.

Настройка базы данных

Должен признаться, это были мои первые проблемы. Начиная от смешного и заканчивая тем, что немного раздражен. Моей первой проблемой было то, что я пытался использовать версию H2 в памяти. Это не будет работать, потому что, по логике, каждый экземпляр Karaf работает в своей собственной JVM. Итак, из-за нескольких приложений я запустил h2 в режиме сервера (см.  Здесь  для получения дополнительной информации).

java -cp h2*.jar org.h2.tools.Server jdbc:h2:tcp://localhost/~/test

Следующая проблема заключалась в том, что из-за некоторых исключений ProcessEngines запускались и останавливались в казалось бы случайных порядках. Имея databaseSchemaUpdate набор свойств для создания-уронить вызывали проблемы с таблицами не присутствует из — за случайного падения / создания. Я рекомендую создавать таблицы самостоятельно ( вот  sqls).

Это не решило все мои проблемы с базой данных. Я подозревал, что H2 не способен обрабатывать вход одного и того же пользователя дважды (на что он способен, насколько я знаю сейчас). После этого я перешел на MySQL.

Настройка MySQL в Карафе

MySQL немного сложнее настроить, чем H2, потому что мы должны создать правильный источник данных. Для начала нам нужно установить  Apache Karaf DataSources :

feature:install jdbc

Затем создайте источник данных

jdbc:create -u sa -p sa -url jdbc:mysql://localhost:3306/test -t MySQL test

Команда создания источника данных должна быть выполнена на обоих Karafs, потому что источник данных — *. Xml, который будет создан в каталоге развертывания, не будет скопирован. Чтобы ProcessEngine мог найти источник данных MySQL, ему нужно имя JNDI. Чтобы дать источнику данных имя JNDI, нам нужен  Apache Karaf Naming .

feature:install jndi

Теперь источник данных автоматически получит имя JNDI (проверьте с помощью jndi:names). Если вы не видите  jndi:* команд, вам придется установить эту функцию вручную на втором Karaf.

Наконец, нам нужен коннектор MySQL. Мы можем найти это  здесь . Просто поместите банку в каталог развертывания.

До сих пор база данных MySQL работает нормально. Давайте посмотрим на файл конфигурации.

Файл конфигурации

Когда я начинал этот «эксперимент», я думал, что использование директории etc / в Karaf было бы хорошей идеей, но теперь я должен сказать: пожалуйста, не пытайтесь делать этот файл на основе. Я перепробовал много комбинаций, и это не сработало. Самым близким, что я получил, была конфигурация, прибывающая на оба Карафа, но только один создаваемый двигатель. Жан-Батист  и  Ахим  действительно пытались помочь мне в списке рассылки. Тем не менее, я не мог заставить его работать. Вы можете попробовать.

Караф просматривает каталог etc / для файлов конфигурации. Чтобы развернуть один для ManagedProcessEngineFactroy, вам нужно будет назвать его  org.camunda.bpm.extension.osgi.configadmin.ManagedProcessEngineFactory-1.cfg.

Я переключился на комплект, который содержит конфигурацию.

Пакет конфигурации

Как упоминалось ранее, для ManagedServiceFactory для создания службы требуется одна или несколько конфигураций. Мы будем использовать простую версию конфигурации:

databaseSchemaUpdate=false
jobExecutorActivate=true
processEngineName=TestEngine
databaseType=mysql
dataSourceJndiName=osgi:service/jdbc/test

Если вы хотите попробовать H2, конфигурация будет выглядеть так:

databaseSchemaUpdate=false
jdbcUrl=jdbc:h2:tcp://localhost/~/test
jobExecutorActivate=true
processEngineName=TestEngine
jdbcUsername=sa
jdbcPassword=sa

Чтобы упростить процесс, пакет просто использует  BundleActivator, получает Администратора конфигурации и предоставляет свойство, например:

public class Activator implements BundleActivator {

    public void start(BundleContext context) throws Exception {
        ServiceReference ref = context.getServiceReference(ConfigurationAdmin.class.getName());
        ConfigurationAdmin admin = (ConfigurationAdmin) context.getService(ref);
        String pid = "org.camunda.bpm.extension.osgi.configadmin.ManagedProcessEngineFactory";
        Configuration configuration = admin.createFactoryConfiguration(pid, null);
        Hashtable properties = new Hashtable();
        properties.put("databaseSchemaUpdate","false");
        properties.put("jobExecutorActivate","true");
        properties.put("processEngineName","TestEngine");
        properties.put("databaseType","mysql");
        properties.put("dataSourceJndiName", "osgi:service/jdbc/test");
        configuration.update(properties);
    }

Слушатель активированного пакета должен предоставить пакет всем карафам. Просто поместите пакет в каталог развертывания.

Вы должны увидеть, что конфигурация тоже стала доступной. Для проверки просто запустите эту команду:config:list "(service.pid=org.camunda.bpm.extension.osgi.configadmin.ManagedProcessEngineFactory*)"

TL; DR;

  1. изменить номера портов  etc/org.apache.karaf.management.cfg и, etc/org.apache.karaf.shell.cfg если вы запускаете два экземпляра на одном компьютере
  2. feature:repo-add mvn:org.apache.karaf.cellar/apache-karaf-cellar/3.0.1/xml/features
  3. feature:install cellar
    1. Решите, хотите ли вы активировать слушателя или использовать кластер: команды для следующих вещей
  4. git clone https://github.com/camunda/camunda-bpm-platform-osgi.git
  5. mvn установить проект
  6. feature:repo-add mvn:org.camunda.bpm.extension.osgi/camunda-bpm-karaf-feature/1.1.0-SNAPSHOT/xml/features
  7. feature:install camunda-bpm-karaf-feature-minimal
  8. настроить базу данных MySQL
  9. feature:install jdbc
  10. поместите jar коннектора MySQL в каталог развертывания
  11. jdbc:create -u sa -p sa -url jdbc:mysql://localhost:3306/test -t MySQL test
  12. feature:install jndi
  13. создайте конфигурационный комплект и поместите его в каталог развертывания. Конфигурация:
    databaseSchemaUpdate=false
    jobExecutorActivate=true
    processEngineName=TestEngine
    databaseType=mysql
    dataSourceJndiName=osgi:service/jdbc/test

И ты в порядке.

Итак, это было мое путешествие в мир погреба Караф. Я надеюсь, что смогу доказать вам выполнимость. Я оставлю практические последствия в качестве упражнения для читателя 😉