Camunda modeler как изменить размер кубика

Camunda Modeler позволяет довольно легко набросать BPMN-схему процесса, перетащив элементы в рабочую область и соединив их стрелками. Далее дела обстоят немного...

Время прочтения
7 мин

Просмотры 7.9K

Camunda Modeler позволяет довольно легко набросать BPMN-схему процесса, перетащив элементы в рабочую область и соединив их стрелками. Далее дела обстоят немного сложнее: нужно быть очень внимательным, чтобы с первого раза для каждого элемента заполнить необходимые поля в панели свойств и не допустить ни одной ошибки. С этой точки зрения создание исполняемых BPMN-схем напоминает программирование в Блокноте.

Например, очень легко в Script Task написать скрипт на Groovy и забыть указать Script Format. Тогда по умолчанию движок попробует выполнить переданную ему строку как JUEL-код, и вряд ли мы получим ожидаемый результат.

Было бы неплохо иметь что-то вроде подсказок, на какие поля нужно обратить внимание, какое значение вписать, какие флаги отметить, и так далее в соответствии с принятыми в команде практиками. К счастью, Camunda Modeler позволяет расширять функциональность, не форкая всё приложение, а применив плагины, что мы и решили сделать.

Разберем несколько важных для нас плагинов:

  • BPMN Linter — статический анализатор BPMN-файлов с графическим отображением найденных ошибок. Позволяет добавить собственные правила, с помощью которых мы и справились с описанной выше болью.

  • Transaction boundaries — визуализация границы транзакций.

  • Token simulation — моделирование токена в BPMN-процессе.

А в конце статьи посмотрим, как можно создать плагин самому.

Установка

Сам по себе Camunda Modeler является Electron-приложением, а плагин представляет собой модуль Node.js.

module.exports = {
  name: 'My Awesome Plugin', // the name of your plugin
  style: './style.css', // changing the appearance of the modeler
  menu: './menu.js', // adding menu entries to the modeler
  script: './script.js' // extend the modeling tools for BPMN, CMMN and DMN
};

Для установки достаточно поместить проект плагина в одну из директорий:

  • {APP_DATA_DIRECTORY}/resources/plugins, где {APP_DATA_DIRECTORY}— директория, в которой находится исполняемый файл Camunda Modeler.

  • {USER_DATA_DIRECTORY}/camunda-modeler/resources/plugins, где {USER_DATA_DIRECTORY}— директория, в которой находятся пользовательские данные приложений:

    • %APPDATA% в Windows;

    • $XDG_CONFIG_HOME или ~/.config в Linux;

    • ~/Library/Application Support в macOS.

Плагины появляются в Camunda Modeler после перезапуска приложения, некоторые можно включить/выключить в меню Plugins.

BPMN Linter

Плагин анализирует XML-файл схемы на соответствие правилам и подсвечивает проблемные места. В комплекте идет набор стандартных правил, их можно отключить в файле .bpmnlintrc или сменить уровень c error на warning.

{
  "extends": "bpmnlint:recommended",
  "rules": {
    "label-required": "off",
    "no-inclusive-gateway": "warning"

  }
}

Стандартные правила BPMN Linter

В скобках приведено имя правила, по которому его можно отключить в .bpmnlintrc, под спойлером — пример в виде изображения схемы с ошибкой и без.

Условный поток (conditional-flows)

Проверяет, что из условного fork-шлюза выходит условный поток или поток по умолчанию.

Пример

Справа — после добавления условия.
Справа — после добавления условия.
<bpmn:sequenceFlow name="Conditional">
  <bpmn:conditionExpression>foo</bpmn:conditionExpression>
</bpmn:sequenceFlow>

Завершающее событие обязательно (end-event-required)

Проверяет, что каждый процесс и подпроцесс имеет завершающее событие.

Пример

Типизированное начальное событие в подпроцессе по событию (event-sub-process-typed-start-event)

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

Пример

Ложное соединение (fake-join)

Согласно правилу, задачи и события не должны соединять собой потоки управления, эту роль должен выполнять join-шлюз.

Пример

Имя обязательно (label-required)

У каждого элемента должно быть заполнено поле «Name».

Никаких шлюзов включающего «ИЛИ» (no-inclusive-gateway)

Во-первых, у этого шлюза сложная fork- и join-семантика (подробнее). Во-вторых, по утверждению авторов правила, поддержка шлюза, включающего ИЛИ, в Camunda Engine реализована не полностью. Кстати, на Хабре была статья про дедлок в Camunda, и там как раз был замешан inclusive gateway.

Пример

Никаких комплексных шлюзов (no-complex-gateway)

По сравнению с предыдущим правилом здесь всё гораздо прозаичнее. Комплексный шлюз не имеет строгого определения в BPMN-нотации, и поэтому BPM-движками не поддерживается в принципе.

Пример

Никаких несоединенных объектов (no-disconnected)

Объект должен быть соединен с помощью либо входящего, либо исходящего потока управления.

Пример

Никаких дублируемых потоков управления (no-duplicate-sequence-flows)

Линтер подсветит, если потоки повторяются, приводя к непреднамеренному ветвлению.

Пример

Никаких join-fork-шлюзов (no-gateway-join-fork)

За соединение должен отвечать один шлюз, за разветвление — другой.

Пример

Никаких неявных ветвлений (no-implicit-split)

Проверяет, что из задачи не исходит более одного потока. Для ветвления должны использоваться шлюзы.

Пример

Единственное пустое начальное событие (single-blank-start-event)

Проверяет, что процесс или подпроцесс имеет только одно пустое начальное событие.

Пример

Начальное событие обязательно (start-event-required)

Пример

Пустое начальное событие в простом подпроцессе (sub-process-blank-start-event)

Пример

Лишний шлюз (superfluous-gateway)

Если шлюз имеет только один вход и один выход, то он будет помечен как лишний.

Пример

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

Проще всего будет дополнительно установить стартер проект. Правило в виде JS-файла помещаем в директорию bpmnlint-plugin-custom/rules и прописываем его в bpmnlint-plugin-custom/index.js.

module.exports = {
  configs: {
    recommended: {
      rules: {
        'my-custom-rule': 'error'
      }
    }
  }
}

В конце активируем правило в локальном файле .bpmnlintrc.

Одно из правил, которое мы используем и о причине существования которого упоминал в самом начале: Script Format в Script Task должен быть Groovy

const {
    is
} = require('bpmnlint-utils');


/**
 * Rule reports that script format is not groovy
 */
module.exports = function () {

    function check(node, reporter) {
        if (is(node, 'bpmn:ScriptTask')) {
            if (!node.hasOwnProperty('scriptFormat')) {
                reporter.report(node.id, 'Script Task has no script format');
            } else if (node.scriptFormat.toLowerCase() !== 'groovy') {
                reporter.report(node.id, 'Script format should be groovy');
            }
        }
    }

    return {
        check: check
    };
};

Примеры других наших правил

Service Task должен иметь флаг asynchronous after

Правило повторяет смысл плагина Transaction Boundaries, только здесь мы явно указываем на необходимость проставить Asynchronous After.

const {
    is
} = require('bpmnlint-utils');


/**
 * Rule that reports Async After isn't checked
 */
module.exports = function () {

    function check(node, reporter) {
        if (is(node, 'bpmn:ServiceTask') && (!node.hasOwnProperty('asyncAfter') || node.asyncAfter !== true)) {
            reporter.report(node.id, 'Asynchronous After should be checked');
        }
    }

    return {
        check: check
    };
};

Error Boundary Event должен иметь Message Variable

В Message Variable записывается сообщение исключения, которое мы обычно используем при обработке ошибки.

const {
    is
} = require('bpmnlint-utils');


/**
 * Rule that reports error message variable absence in Boundary Event.
 */
module.exports = function () {

    function check(node, reporter) {
        if (is(node, 'bpmn:ErrorEventDefinition') &&
            is(node.$parent, 'bpmn:BoundaryEvent')) {
            if (!node.hasOwnProperty('errorMessageVariable')) {
                reporter.report(node.$parent.id, 'Error Boundary Event has no error message variable');
            }
        }
    }

    return {
        check: check
    };
};

Теперь давайте взглянем на другие плагины из нашего списка — Transaction Boundaries и Token Simulation.

Transaction Boundaries

Визуализирует границы транзакций, которые в моделлере устанавливаются с помощью флагов asynchronous before и asynchronous after. Отличный плагин, если вы следуете rule of thumb и каждый Service Task помечаете как асинхронный: он помогает не забыть поставить соответствующий флаг в нужном месте.

Пример

Token Simulation

Есть отдельные статьи, описывающие концепцию токена в BPMN. Если вкратце: токены служат для описания поведения BPMN-процесса, начальное событие выпускает токен, который обходит процесс, разделяясь на fork-шлюзах и соединяясь на join-шлюзах. Запустится ли join-шлюз, зависит от количества ожидаемых и пришедших в него токенов. Порой сложно понять, способен ли процесс завершиться, просто взглянув на него, и тут на помощь приходит плагин Token Simulation (к сожалению не поддерживает Inclusive Gateway).

Пример с параллельным шлюзом, когда схема не завершится

Join-шлюз соединяет четыре потока и запустится только в том случае, если на него придет четыре токена, но из-за XOR-шлюза всегда будет приходить только три.

Рабочий вариант

Три потока, три токена — процесс дошел до конца.

Создание своего плагина

Рассмотрим создание плагина на примере расширения возможностей поиска в BPMN-схеме. Точнее, будем искать элементы не только по имени и id, но и по Java-классу если это Service Task.

Воспользуемся стартер-проектом. Создаем файл client/search-extension/index.js, в котором будем экспортировать наш модуль плагина. В Camunda Modeler за поиск отвечает модуль BpmnSearchProvider.js, для простоты сделаем топорно и скопируем этот файл в client/search-extension , а затем дополним условия поиска:

...
  elements = map(elements, function(element) {
    return {
      primaryTokens: matchAndSplit(getLabel(element), pattern),
      secondaryTokens: matchAndSplit(element.id, pattern),
      javaClassTokens: element.businessObject.hasOwnProperty('class') ? matchAndSplit(element.businessObject.class, pattern) : [],
      element: element
    };
  });
...
  // exclude non-matched elements
  elements = filter(elements, function(element) {
    return hasMatched(element.primaryTokens) || hasMatched(element.secondaryTokens) || hasMatched(element.javaClassTokens);
  });
...

В client/search-extension/index.js прописываем:

import BpmnSearchProvider from './BpmnSearchProvider';

export default {
  __depends__: [
    SearchPadModule
  ],
  __init__: [ 'bpmnSearch'],
  bpmnSearch: [ 'type', BpmnSearchProvider ]
};

В client/index.js:

import {
  registerBpmnJSPlugin
} from 'camunda-modeler-plugin-helpers';

import BpmnSearchProvider from './search-extension';

registerBpmnJSPlugin(BpmnSearchProvider);

Выполняем npm run all и перезапускаем Camunda Modeler.

Вуаля

Заключение

В статье описаны только используемые нами плагины и не затронуты DMN-таблицы, для которых также есть полезные дополнительные фичи.

  • Общая документация к плагинам.

  • Список плагинов в одном месте в README.md репозитория.

  • Оригинальное описание правил BPMN linter.

Евгений Тришечкин

Евгений Тришечкин


ведущий Java-разработчик ростовского офиса компании Usetech

Меня зовут Евгений Тришечкин, я ведущий Java разработчик ростовского офиса компании Usetech, и сегодня хочу поделиться с вами применением Camunda BPM в Java разработке.

В рамках статьи я расскажу об основных компонентах системы управления бизнес-процессами Camunda. Покажу развертывание системы, моделирование и деплой простого процесса. А также, на примере созданного процесса, проиллюстрирую взаимодействие Java/SpringBoot приложения с Camunda.

Давайте сначала разберемся с терминологией и выясним, что же такое BPM, BPMS и BPMN.

BPM (Business process management) — концепция управления организацией, рассматривающая бизнес-процессы как особые ресурсы предприятия, непрерывно адаптируемые к постоянным изменениям, и полагающаяся на такие принципы, как понятность и видимость бизнес-процессов в организации за счет их моделирования с использованием формальных нотаций, использования программного обеспечения моделирования, симуляции, мониторинга и анализа бизнес-процессов, возможность динамического перестроения моделей бизнес-процессов силами участников и средствами программных систем.

Другими словами, BPM отвечает на вопросы, где, когда, зачем, как и какая задача выполняется и кто отвечает за ее выполнение.

BPMS (Business Process Management System) – программное обеспечение, обеспечивающее прикладную реализацию концепции BPM.

BPMN (Business Process Modeling Notation) – нотация (система графических обозначений и их описание в формате XML) бизнес-процесса.

BPMS на рынке существует великое множество, включая лидеров рынка – Oracle или IBM. Из названия понятно, что эти системы очень мощные, сильные, дорогие и подходят далеко не каждой организации, а стоимость их внедрения может начинаться от 100.000 евро и выше. Понятно, что только крупные компании могут себе позволить внедрить такую систему.

  1. На мой взгляд небольшим компаниям стоит обратить внимание на другие системы, внедрение которых обойдется в меньшие деньги. Например, российская компания ELMA запустила свой собственный продукт ELMA BPM, написанный на стеке .NET и имеющий бесплатную версию. Цена на Enterprise версию также вполне демократичная, кроме того, на сайте можно найти обучающие курсы и много другой полезной информации.
  2. Из зарубежных вендоров с демократическими ценами или бесплатными версиями я бы выделил jBPM.
  3. И еще одна бесплатная BPM система Аctivity, которую в 2013 году форкнули и из которой получилась известная многим Camunda BPM.

Компания Camunda Services, которая является вендором Camunda BPM, долгое время занималась консультированием организаций в области управления бизнес-процессами, но в результате создала свой продукт и начала активно его развивать.

В сети есть разные сравнения Аctivity и Camunda и, по большей части, они в пользу последней, да и список компаний, использующих камунду достаточно обширный: Deutsche Bank, Goldman Sachs Group, Тинькофф банк, Сбер, Теле 2 и т.д.

Мы все понимаем, что бизнес-процесс должен быть максимально понятным. Моделирование процессов происходит с применением нотаций (нотации — это система графических обозначений и их описание в формате XML). Нотаций существует довольно много, но самая популярная из них, конечно, текущая версия BPMN 2.0 (2.0.2 – 2014 г), которая постепенно развивается и пополняется новыми элементами.

Рассмотрим пример бизнес-процесса, описанном нотацией BPMN:

На картинке изображен процесс регистрации нового пользователя на портале, в достаточно упрощенном формате.

Здесь нарисован пул процесса и отдельными линиями – дорожки процесса. Каждая дорожка — это отдельная роль бизнес-процессов. Верхняя — это инициатор процессов, посередине – портал и внизу – ответственный за исполнение бизнес-процессов.

Зеленый кружок — стартовые события процессов, красные кружки – конечные события процессов.

Прямоугольник — задачи (=таски), которые исполняются во время жизненного цикла бизнес-процесса.

Задачи со значком шестеренок — сервисные задачи, которые не требуют участия оператора.

Задачи со значком человечка – это те задачи, которые требуют участия человека.

Данная система создана для примера и сильно упрощена, в полноценных системах присутствуют и другие элементы, шлюзы, которые реализуют ветвление, есть перехватчики событий, таймеры, и многое другое.

  • Платформа управления бизнес-процессами, реализующая стандарты BPMN (Business Process Model and Notation), DMN (Decision Model and Notation) и CMMN (Case Management Model and Notation).
  • Community версия имеет открытый исходный код, лицензия Apache-2.0.
  • Основана на технологическом стеке популярного языка программирования Java. Имеет интеграцию с Spring/Spring Boot.

DMN – это модель принятия решения, которая представляет собой таблицу входных значений и результирующего выходного значения. Полезна в таких задачах, как принятие решения. Допустим, нужно принять решения о выдаче кредита или открытии счета и именно в этой таблице DMN вы найдете множество вводных параметров и выходной параметр, то есть результат – выдавать кредит или нет.

Компоненты CAMUNDA BPM (Community)

Давайте подробнее рассмотрим компоненты комьюнити версии Camunda:

  1. Camunda Modeler – кросс-платформенное приложение с графическим интерфейсом, в котором бизнес-аналитик или архитектор процесса может моделировать иили редактировать схемы процессов. Поддерживает нотации BPMN 2.0, DMN 1.1, CMMN 1.1. Это отдельное кросс-платформенное приложение с графическим интерфейсом, в котором бизнес-аналитик или архитектор процесса может составлять иили редактировать схемы процессов.
  2. Camunda Tasklist — веб-приложение, через которое конечные пользователи могут зайти, посмотреть какие задачи на у них назначены и выполнить какие-то действия.
  3. Camunda Cockpit – веб-приложение, которое создано для операторов или владельцев бизнес-процессов, обеспечивающее мониторинг и управление бизнес-процессами
  4. Camunda Admin – веб-приложение, интерфейс администратора системы, в котором идет управление ролями, пользователя, группами и т.д.
  5. Центральная часть системы Camunda BPM – это движок, который управляет процессом в соответствии с нарисованными схемами и нотациями CMMN и тд, и преобразует их в код, а потом — исполняет.
  6. Обратите внимание, что над движком существует надстройка, которая реализует REST или Java API. REST/Java API — программный интерфейс системы, обеспечивающий взаимодействие как с внешними (REST), так и внутренними (Java) компонентами. Rest API достаточно обширный, удобный и позволяет реализовывать всякие кастомные приложения. Например, там можно написать свой таск-лист, но подробнее мы рассмотрим эту возможность чуть позже.

Компоненты Camunda BPM (Enterprise)

Enterprise версия – платная, договор, тех поддержка 247 и в техническом плане она получше комьюнити версии. Например, появляются:

Enterprise Cockpit — расширенная версия Camunda Cockpit, содержащая в себе дополнительные функции: развертывание описаний процессов, перезапуск экземпляров процессов, расширенный поиск по экземплярам процессов, миграция экземпляров процессов между версиями.

Camunda Optimize — оптимизация и улучшение бизнес-процессов, выявление «узких мест», отчеты и «тепловые карты» процессов, все это помогает улучшить, оптимизировать и модернизировать бизнес-процессы.

Пример тепловой карты процесса

Тепловая карта показывает относительную частоту выполнения той или иной задачи в процессе. Она помогает визуализировать результат и принять решение, какой участок более нагружен и за счет каких ресурсовдействий его можно разгрузить.

Способы развертывания Camunda BPM

Как я ранее писал, Camunda BPM написана на тех. стеке Java, поэтому у нее есть много способов развертывания.

Первый и самый простой – встроенная библиотека в приложении и именно его мы будем подробно разбирать.

Второй способ тоже подходит для Java приложений — сервис внутри сервера приложений или контейнера сервлетов («расшаренный» сервис), который могут использовать другие приложения, развернутые в контейнере.

Третий способ, если приложения написаны не на Java, развернуть Camunda как отдельно стоящий сервер и приложение будут с ним контактировать по Rest API удаленно.

Четвертый способ для высоконагруженных систем — кластерное развёртывание для высоконагруженных систем, когда есть общая база данных и несколько нод с камундой.

Практическая часть – пробуем Camunda своими руками

  1. Заходим на https://start.camunda.com/.
  2. Знакомимся с Initializr, который достаточно примитивный, но рабочий. В нем вводим — группу, артефакт, версию Сamunda, версию Java (она никак там не ограничивается, я пробовал java 135 — все нормально, проект сгенерировался). Хочу обратить ваше внимание, что другие языки программирования кроме Java, Scala, Kotlin, выбрать нельзя.
  3. Скачиваем и открываем сгенерированный проект.

Внутри мы видим один класс Application — @SpringBootApplication, как я и писал ранее, камунда хорошо интегрируется со SpringBoot. А также в проекте есть файл с настройками приложения и файл с описанием процесса в формате BPM.

Процесс состоит из следующих этапов: стартовое событие, пользовательская задача, конечное событие. Пользовательская задача, самая простая, выглядит так: пользователь открыл задачу, нажал – завершить задачу и процесс завершился.

Но давайте немного усложним задачу и внесем изменения в процесс. Процесс мы сделаем процессом регистрации пользователя на портале, тот пример, о котором мы говорили в начале статьи и к которому обещал вернуться. Для этого нам нужно изменить стартовое событие и добавить туда переменную «username», которая добавляется через Camunda Modeler (кросс-платформенное решение, скачивается с официального сайта, бесплатное)

В результате у нас получилось модифицировать стартовое событие. Дальше необходимо модифицировать пользовательскую задачу, тут же добавляем форму с именем пользователя. Причем имя пользователя мы делаем «read only», чтобы тот человек, который будет утверждать создание нового пользователя не мог изменить его имя. А также добавляем переменную «decision», которая позволяет утвердить или отклонить эту регистрацию.

Запускаем экземпляр процесса. Для запуска экземпляра процесса заходим в приложение Camunda Tasklist (веб-приложение, через которое конечные пользователи могут зайти, посмотреть какие задачи на них назначены и выполнить какие-то действия) и нажимаем «Запустить процесс».

Находим свой демо процесс, который мы создали и видим форму запуска процесса.

После этого появляется окошко для ввода имени пользователя (переменная username), заполняем его и запускаем процесс.

Процесс запущен, и мы видим, что на пользователя Demo упала задача. Задача, как и ожидается называлась отклонить или утвердить регистрацию. Выделяем ее и видим форму, которую мы создавали. Также мы видим имя пользователя, которое нельзя редактировать, а решение – можно. Завершаем задачу, нажав кнопку «Complete» и на этом процесс завершается.

Давайте добавим немного экшена в процесс и усложним задачу – создадим ветвления.

Для этого добавляем к существующему процессу — шлюз, который будет «ветвить» этот алгоритм:

  • Если decision равен true, тогда создать нового пользователя.
  • Если decision равен false, то просто отправить уведомление о том, что пользователь не создан.

И также создаем конечное событие. В результате у нас появляются два сервисных таска: создать нового пользователя и отправить уведомление. Сервисные таски, как я уже писал ранее, это таски, которые не требуют участия оператора в их выполнении. Следовательно, в них должна быть заложена логика и здесь мы покажем простой способ взаимодействия с Java кодом.

Выделяем модуль или сервисный таск и в нем прописываем implementation, выбирая способ Delegate Expression и добавляем в Delegate Expression собственное имя. Собственно этот бин нам и нужно создать в коде.

Для этого создаем класс CreateNewUser, помечаем его как компонент, чтобы спринг создал в контексте соответствующий бин, а этот класс должен имплементировать JavaDelegate.

В JavaDelegate есть метод execute, который и будет выполняться, когда поток выполнения придет в этот сервисный таск. На примере выше мы видим, что из переменной DelegateExecution можно вытащить переменную процесса, то есть username, которую мы вводили при старте процесса. Если все пройдет успешно, то в логе мы увидим сообщение, что пользователь успешно зарегистрирован.

Аналогично поступим в другим сервисным таском – отправить уведомление.

Также пропишем Delegate Expression, добавляем ему имя бина «notifyUser» и создаем соответствующий компонент, реализующий JavaDelegate в коде.

Внутри метода execute мы возьмем переменную decision, также через объект DelegateExecution, и в зависимости от этой переменной вы увидите разные сообщения:

  • если decision равен true, то мы видим «, добро пожаловать на портал!»
  • если decision равен false, то мы видим «, вам отказано в регистрации»

Вот этот способ через DelegateExecution работает только в случае с Java приложениями.

Возникает вопрос: а что делать, если приложение не на Java или если Camunda развернута на отдельном сервер?

В этом случае выбираете способ имплементации не Delegate Expression, а External и просто указываете какой-то топик, куда будет отправлен месседж и, соответственно, через очереди будет делегироваться выполнение в ваш код.

Последний шаг – запустить все то, что мы создали. Вводим имя

Видим таск «утвердитьотклонить регистрацию». Допустим, мы отклоняем регистрацию. Тогда не ставим галочку в поле «Утвердить?» и нажимаем «Complete».

После этого переходим в логи и видим, что пользователю Дарт Вейдер отказано в регистрации

Если мы принимаем регистрацию, то ставим галочку в поле «Утвердить?» и нажимаем «Complete». В этом случае процесс исполняется по другой ветке и в логах отображается по-другому.

Вместо вывода

Выше я описал самую простую схему процесса. В реальности же системы намного сложнее с множественными ветвлениями, а в эти диаграммы BPM можно вставлять другие таски, которые могут реализовать нотации DMN.

Camunda не позиционирует себя как low-code или no-code система. Camunda позиционирует себя как систему, где должно быть разумное сочетание, своеобразный симбиоз, между бизнесом, аналитиками и разработкой.

Полезные ссылки

  • Быстрый старт
  • Описание стандарта BPMN0
  • Описание Rest API
  • Практический курс BPMN0 от российской компании ELMA

Camunda — это отличный бесплатный BPM-движок для автоматизации бизнес-процессов. В этой статье я расскажу как по шагам сделать первую заготовку проекта с использованием языка Kotlin и Camunda. Уровень сложности материала низкий — статья снабжена скриншотами и видеоверсией. Вам нужно просто пройти по инструкции.

Вот видеоверсия статьи, кому-то может быть удобнее:

Как вообще можно использовать Camunda

Camunda можно использовать в двух вариантах:

  • Standalone-сервер — в этом случае вы ставите приложение с сервером отдельно и заливаете на него свои процессы с помощью .war-файлов. База общая, исполнители задач общие, админка общая.

Я разбирал такой вариант подробно на видео.

  • Библиотека внутри приложения — в этом случае вы разрабатывает обычное Java-приложение (в нашем случае Kotlin), и в зависимостях указываете Camunda. База своя, задачи свои, админка своя, исполнители свои.

Первый вариант удобнее для эксплуатации — следить нужно только за одной базой и одной камундой, но создает проблему “шумных соседей” — если кто-то из коллег сделает кривой процесс, то лягут все.

Второй способ удобнее полной независимостью, но создает сложности в администрировании и управлении задачами. Какой вариант выбирать каждая компания сама решает, но я за второй: все проблемы решаются, а вот в первом с шумными соседями ничего не сделать. И это ОЧЕНЬ больно и неприятно на проде, когда вы начинаете падать из-за коллег.

Предварительная подготовка рабочего места

Для создания первого проекта на Camunda вам потребуется:

  • Среда разработки — IntelliJ Idea (https://www.jetbrains.com/idea/download/#section=windows). В этой штуке мы будем программировать.
  • Сама Javahttps://java.com/ru/download/ . Эта штука позволит среде разработки понять, что мы написали и обьяснить компьютеру.
  • Postgresql https://www.postgresql.org/download/windows/ . Это база данных, Camunda будет сохранять туда информацию о всём происходящем.
  • Excamadhttps://github.com/KotskinKotskin/camunda-excamad/releases . Это дополнительная админка, которая позволит нам лучше понимать что происходит в Camunda.
  • Camunda modelerhttps://camunda.com/products/modeler/ . Эта штука поможет нам создавать диаграммы в BPMN и решения в DMN.

Поставьте всё себе на компьютер,сложностей не должно возникнуть. Если возникли, то пишите в комментарии, разберемся.

Почему Kotlin и Spring(boot)

Вместо Java мы будем использовать язык Kotlin — это статически типизированный язык программирования, работающий поверх JVM. Он более лаконичный и безопасный, чем Java. И порог входа в него немного ниже, что в этом случае нам очень важно.

Еще мы будем использовать Spring — это набор библиотек для Java, которые делают жизнь проще. А Spring boot — это еще одна штука, которая делает жизнь разработчика со Spring еще проще 🙂 В ообщем, программерская магия, которая не имеет отношения к статье.

Создаем приложение

  1. Создаем приложение —  воспользуемся сайтом https://start.spring.io/, он сформирует для нас структуру проекта и добавит нужные зависимости. Установите такие параметры:
  2. Скачиваем  папку с приложением.
  3. Запускаем IDEA и откройте в ней папку с приложением:
    В параметрах укажите что разрешаете авто-импорт зависимостей.
  4. Создаем базу данных в postgres: запустите приложение PgAdmin, войдите в него с логином и паролем, которое указывали при установке.Подключитесь к локальному серверу и создайте базу camundabpmn2
  5. Указываем данные для подключения к базе в файле application.properties

logging.level.org.springframework.web=DEBUG
spring.datasource.url=jdbc:postgresql://localhost/camundabpmn2
spring.datasource.username=postgres
spring.datasource.password=mypassword
spring.jpa.generate-ddl=true
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

Вы получили работающее приложение, давайте проверим что всё ок. Запустите его:Переходим по адресу в браузере http://localhost:8080. Если вы видите такую картину, то вы красавчик! У вас есть пустое работающее spring приложение.

Запускаем пустую Camunda

Для запуска камунды нам нужно добавить зависимости в файл pom.xml. В этом файле хранится информация о том, какие внешние библиотеки мы используем. Добавим много библиотек — для тестирования, логирования, саму Camunda, REST интерфейсы, работа c JSON. За что отвечает каждая из библиотек понятно из названия. В итоге раздел в pom.xml должен выглядеть так:

<dependencies>
  <dependency>
    <groupId>io.github.microutils</groupId>
    <artifactId>kotlin-logging</artifactId>
    <version>1.6.24</version>
  </dependency>
  <dependency>
    <groupId>org.camunda.bpm.springboot</groupId>
    <artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
    <version>3.2.0</version>
  </dependency>
  <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.6</version>
  </dependency>
  <dependency>
    <groupId>org.camunda.bpm.springboot</groupId>
    <artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
    <version>3.2.0</version>
  </dependency>
  <dependency>
    <groupId>org.camunda.bpm.extension.springboot</groupId>
    <artifactId>camunda-bpm-spring-boot-starter-test</artifactId>
    <version>2.2.0</version>
  </dependency>
  <dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>2.6.0</version>
  </dependency>

  <dependency>
    <groupId>org.camunda.bpm.assert</groupId>
    <artifactId>camunda-bpm-assert</artifactId>
    <version>3.0.0-alpha1</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.camunda.bpm.assert</groupId>
    <artifactId>camunda-bpm-assert</artifactId>
    <version>3.0.0</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.camunda.spin</groupId>
    <artifactId>camunda-spin-dataformat-json-jackson</artifactId>
    <version>1.6.7</version>
  </dependency>
  <dependency>
    <groupId>org.camunda.spin</groupId>
    <artifactId>camunda-spin-core</artifactId>
    <version>1.6.7</version>
  </dependency>
  <dependency>
    <groupId>org.camunda.bpm</groupId>
    <artifactId>camunda-engine-plugin-spin</artifactId>
    <version>7.10.0</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-kotlin</artifactId>
  </dependency>
  <dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-reflect</artifactId>
  </dependency>
  <dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-stdlib-jdk8</artifactId>
  </dependency>

  <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

Ждём, пока скачаются все зависимости (полоска в правом нижнем углу).

  • В главный класс дописываем аннотацию @EnableProcessApplication

  • Добавляем проект excamad в папку static, для того чтобы заработала моя дополнительная админка
  • Запускаем приложение, перейдем по ссылке http://localhost:8080/. Если видим приглашение зарегистрироваться, делаем учетную запись demo/ demo
  • Заходим по ссылке http://localhost:8080/index.html, видим котиков — значит excamad работает. В разделе settings пропишем http://localhost:8080/rest/

Если вы сделали всё правильно, то у вас готова чистая Camunda на Kotlin. Теперь её можно наполнять вашими бизнес-процессами, этим займемся в других статьях.

В итоге

Как вы видите, сделать подготовительную работу  для последующей автоматизации на Camunda совсем не сложно. Проще, чем развернуть кластер IBM BPM. У вас получилось? Напишите о вашем опыте в статье.

Продолжение статьи.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

ТэгиCamunda

Вам так же понравится

With the upcoming Camunda Modeler 5.0 release in April 2022, the entire user experience of the Modeler application will encounter significant updates. To find out more about how these updates will improve the user experience, review the blog post on introducing the new Camunda Modeler 5 features. 

While reading this blog post, learn how you, as a Camunda Modeler plugin maintainer, can update your plugin to benefit from the new features and make your plugin compatible with Camunda Modeler 5 and subsequent versions. Follow along with this guide for using the Camunda Modeler 5.0.0-alpha.0 release.

Migration Overview

When migrating your Camunda Modeler plugin, there are four steps you must take:

  1. Update plugin helper version
  2. Update plugin slot
  3. Use overlay menus instead of modal menus
  4. Update your plugin documentation and compatibility information

These steps are described below in detail. As a reference, we will use the Excel Import Plugin, the Autosave Plugin, and more specifically, the pull requests (Migrate Excel Import Plugin, Migrate Autosave Plugin) which were used to migrate these two plugins.

If you also extended the bpmn-js properties panel as part of your Camunda Modeler plugin, refer to this example repository, or review pull request example #172 and example #9. Both of these examples update an existing properties panel extension. These resources will help you understand how to use the new features, and how to be compatible with the updated properties-panel v1.0.0.

Update Plugin Helper version

The Camunda Modeler Plugin Helpers provide helper functions, which you might need to bundle your Camunda Modeler plugin. For example, they expose the Camunda Modeler user interface (UI) components, which you potentially might want to reuse to implement graphical interfaces as part of your plugin.

As a baseline for the plugin migration,  adjust the camunda-modeler-plugin-helpers dependency of your plugin to the latest version by using the code snippet below, for example:

npm install --save-dev camunda-modeler-plugin-helpers@^5.0.0-alpha.0

In our reference migration pull requests, view these updates Migrate plugin #68 and Migrate plugin #79.

Update Plugin Slot

Plugin slots can be used to display plugin UI controls in Camunda Modeler at different locations. These can then be used for user interaction.

Labelled UI controls in Camunda Modeler

Note that with Camunda Modeler 5.0 and beyond, there’ll no longer be a toolbar. You can now add UI controls in three different locations:

  • In the status bar:
    • slot=”status-bar__file”
    • slot=”status-bar__app”
  • In the tab actions:
    • slot=”tab-actions”

In addition to the slot attribute, you can also specify a group attribute, which allows you to ensure that plugins belonging to each other will appear next to each other (i.e., in the same group).

In our reference migration pull requests, find these updates in Migrate plugin #79 and Migrate plugin #68. The following screenshot shows results for all of the available options:

results for all of the available options

Use Overlay Menus Instead of Modal Menus

Starting with Camunda Modeler 5, we encourage you to use overlay menus instead of modal menus. Overlay menus provide the respective UI controls in a lightweight overlay, directly next to the respective icon that initiated the opening.

modal and overlay menus

You can use overlays by importing the Overlay component (instead of the old Modal component). See an example in Migrate plugin #68. 

Within the ConfigOverlay, you can use the following to arrange the respective UI elements in an organized way:

  • Section.Header
  • Section.Body
  • Section.Actions

In our reference migration pull requests, find these updates in Migrate plugin #68 and Migrate plugin #79.

Update Your Plugin Documentation and Compatibility Info

It’s important that your plugin users understand which version of Camunda Modeler your plugin is compatible with. To ensure this, we recommend adding a basic hint in the README.md file of your plugin repository. 

For example, this can be done by adding a basic badge like this:

Camunda Modeler 5.0+ badge

In our reference migration pull requests, find these updates in Migrate plugin #79 and Migrate plugin #68.

Additional Resources

To learn more about extending Camunda Modeler, review the following resources:

  • Camunda Modeler Plugin Starter Project 
  • Camunda Modeler Plugin Examples
  • Camunda Modeler Plugins Documentation
  • Camunda Modeler 5.0.0-alpha.0 Download

Удобное десктоп приложения для редактирования
BPMN диаграмм и DMN таблиц.

Проектирование бизнес-процессов и бизнес-правил

Camunda Modeler — это настольное приложение для моделирования BPMN процессов и DMN бизнес-правил, позволяющее нескольким разработчикам совместно работать над одними и теми же диаграммами.

Camunda Modeler поддерживает нотации BPMN 2.0, CMMN 1.1 и DMN 1.1 (включая таблицы принятия решений или DRD диаграммы).

Создание исполняемых моделей

Помимо визуального моделирования Camunda Modeler позволяет все свойства, необходимые для исполнения бизнес процесса. Так как Camunda Modeler работает напрямую с BPMN и DMN XML файлами, разработчики могут легко комбинировать его использование со своей любимой IDE (например Eclipse, Netbeans или IntelliJ).

Созданные XML файлы могут быть затем развернуты на платформе Camunda и соответственно выполнены BPMN и DMN движками.

Шаблоны элементов Шаблоны элементов

Шаблоны элементов позволяют создавать преопределенные конфигурации в виде JSON файлов, чтобы пользователи в дальнейшем работали с дополнительно настроенной панелью.

Например можно сделать конфигурацию для «Email Task», так чтобы всегда запрашивались адреса отправителя и получателя, тема и тело письма. Сразу после развертывания эта задача будет выполняться в соответствии с предопределенной логикой.

Это позволяет предоставить настраиваемую среду для создания и настройки бизнес процессов организации, при этом количество написания кода будет минимизировано.

Дополнительные плагины

Можно добавить плагины в Modeler чтобы изменить его внешний вид, добавить новые пункты меню или расширить инструменты для моделирования BPMN, CMMN и DMN.

Чтобы добавить плагин достаточно поместить нужные файлы в соответствующий каталог.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Camtasia an error occurred in the recorder video codec
  • Camry ошибка u0100
  • Camry error 3
  • Cannot import extractfilename at 1 0 как исправить
  • Cannot import error accessing the registry

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии