Автор оригинала: Kumar Chandrakant.
1. Обзор
Flowable является двигателем бизнес-процессов, написанным на Java. В этом учебнике мы пройдемся по деталям бизнес-процессов и поймем, как мы можем использовать API Flowable Java для создания и развертывания примерного бизнес-процесса.
2. Понимание бизнес-процессов
Проще говоря, Бизнес-процесс – это набор задач, которые после завершения в определенном порядке выполняют определенную цель . Каждая задача в бизнес-процессе четко определила входные данные и результаты. Эти задачи могут потребовать вмешательства человека или могут быть полностью автоматизированы.
OMG (Группа по управлению объектами) определила стандарт под названием Модель бизнес-процессов и нотация (BPMN) для бизнеса, чтобы определить и сообщить свои процессы . BPMN получил широкую поддержку и признание в отрасли. Flowable API полностью поддерживает создание и развертывание определений процессов BPMN 2.0.
3. Создание определений процессов
Допустим, у нас есть простой процесс для обзора статьи перед публикацией.
Суть этого процесса заключается в том, что авторы представляют статью, и редакторы либо принимают, либо отвергают ее. Если статья принята, она публикуется немедленно; однако, в случае отклонения, автор уведомляется по электронной почте:
Мы создаем определения процессов как XML-файлы с использованием стандарта BPMN 2.0 XML.
Давайте определим наш простой процесс в соответствии со стандартом BPMN 2.0:
Теперь, Есть довольно много элементов здесь, которые являются стандартными XML вещи, в то время как другие являются специфическими для BPMN 2.0:
- весь процесс завернут в тег под названием “процесс”, которая, в свою очередь, является частью тега под названием “определения”
- Процесс состоит из событий, потоков, задач и шлюзов
- Событие является либо стартовым событием, либо событием окончания
- Поток (в этом примере поток последовательности) соединяет другие элементы, такие как события и задачи
- Задачи, где фактическая работа сделана; это могут быть, в частности, “задачи пользователя” или “задачи обслуживания”
- Задача пользователя требует от пользователя взаимодействовать с API Flowable и принимать меры
- Задача службы представляет собой автоматическую задачу, которая может быть вызовом в класс Java или даже вызовом HTTP
- Шлюз выполняется на основе атрибута “утвержденный”; это известно как переменная переменная , и мы увидим, как установить их позже
Хотя мы можем создавать файлы определения процессов в любом текстовом редакторе, это не всегда самый удобный способ. К счастью, однако, Flowable также поставляется с вариантами пользовательского интерфейса, чтобы сделать это с помощью Затмение плагин или Веб- . Если вы используете IntelliJ вместо этого, есть Плагин IntelliJ доступны, а также.
4. Работа с Flowable API
Теперь, когда мы определили наш простой процесс в файле XML в соответствии со стандартом BPMN 2.0, нам нужен способ представить и запустить его. Flowable предоставляет API Process Engine для взаимодействия с flowable Engines . Flowable очень гибок и предлагает несколько способов развертывания этого API.
Учитывая, что Flowable является Java API, мы можем включить движок процесса в любое java-приложение, просто включив необходимые файлы JAR. Мы вполне можем использовать Maven для управления этими зависимостями.
Кроме того, Flowable поставляется с пакетными API для взаимодействия с Flowable через HTTP. Мы можем использовать эти API, чтобы сделать все возможное через Flowable API.
Наконец, Flowable имеет отличную поддержку для интеграции с весна и весна Boot! Мы будем использовать Flowable и Весна Boot интеграции в нашем учебнике.
5. Создание демо-приложения с двигателем процесса
Давайте создадим простое приложение, которое обернет движок процесса из Flowable и предлагает API на основе HTTP для взаимодействия с Flowable API. Там также может быть веб-или мобильное приложение сидит на вершине API, чтобы сделать опыт лучше, но мы будем пропускать для этого для этого учебника.
Мы создадим нашу демонстрацию в качестве приложения Spring Boot.
5.1. Зависимости
Во-первых, давайте посмотрим, зависимости мы должны тянуть от Maven:
org.springframework.boot spring-boot-starter-web org.flowable flowable-spring-boot-starter 6.4.1 com.h2database h2 runtime
Зависимости, которые нам нужны, доступны в Maven Central:
- Весенняя загрузка стартер для веб- – это стандартный стартер для весенней загрузки
- Flowable стартер для весенней загрузки – это необходимо для весенних загрузоливых двигателей
- H2 База данных – Flowable требует базы данных для хранения данных, а H2 — база данных памяти по умолчанию
5.2. Определение процесса
Когда мы запускаем наше приложение Spring Boot, оно пытается автоматически загрузить все определения процессов, присутствующие под папкой “ресурсы/процессы”. Поэтому давайте создадим файл XML с определением процесса, которое мы создали выше, с названием “статья-workflow.bpmn20.xml”, и поместите его в эту папку.
5.3. Конфигурации
Поскольку мы знаем, что Spring Boot использует высокоуверенный подход к конфигурации приложения, что верно и для Flowable как часть Spring Boot. Например, обнаружение H2 в качестве единственного драйвера базы данных на classpath, Flowable автоматически настраивает его для использования .
Очевидно, что каждый аспект, который настраивается может быть настроен на заказ через свойства приложения . Для этого учебника, однако, мы будем придерживаться по умолчанию!
5.4. Делегаты Java
В нашем определении процесса мы использовали несколько классов Java, которые должны вызываться в качестве частей задач службы. Эти классы реализуют JavaDelegate интерфейс и известны как Java делегатов в Flowable . Теперь мы определим классы манекенов для этих делегатов Java:
public class PublishArticleService implements JavaDelegate { public void execute(DelegateExecution execution) { System.out.println("Publishing the approved article."); } }
public class SendMailService implements JavaDelegate { public void execute(DelegateExecution execution) { System.out.println("Sending rejection mail to author."); } }
Очевидно, что мы должны заменить эти фиктивные классы с фактическими услугами для публикации статьи или отправить по электронной почте.
5.5. API HTTP
Наконец, давайте создадим несколько конечных точек для взаимодействия с двигателем процесса и работы с процессом, который мы определили.
Начнем с определения контроллера, разоблачающего три конечные точки:
@RestController public class ArticleWorkflowController { @Autowired private ArticleWorkflowService service; @PostMapping("/submit") public void submit(@RequestBody Article article) { service.startProcess(article); } @GetMapping("/tasks") public ListgetTasks(@RequestParam String assignee) { return service.getTasks(assignee); } @PostMapping("/review") public void review(@RequestBody Approval approval) { service.submitReview(approval); } }
Наш контроллер предоставляет конечные точки представить статью для рассмотрения, получить список статей для рассмотрения, и, наконец, представить обзор для статьи. Статья и Утверждение являются стандартными POJOs, которые можно найти в репозитории.
На самом деле мы делегирования большую часть работы СтатьяРаботная служба :
@Service public class ArticleWorkflowService { @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Transactional public void startProcess(Article article) { Mapvariables = new HashMap<>(); variables.put("author", article.getAuthor()); variables.put("url", article.getUrl()); runtimeService.startProcessInstanceByKey("articleReview", variables); } @Transactional public List getTasks(String assignee) { List tasks = taskService.createTaskQuery() .taskCandidateGroup(assignee) .list(); return tasks.stream() .map(task -> { Map variables = taskService.getVariables(task.getId()); return new Article(task.getId(), (String) variables.get("author"), (String) variables.get("url")); }) .collect(Collectors.toList()); } @Transactional public void submitReview(Approval approval) { Map variables = new HashMap (); variables.put("approved", approval.isStatus()); taskService.complete(approval.getId(), variables); } }
Большая часть кода здесь довольно интуитивно понятна, но давайте поймем основные моменты:
- Запуск службы мгновенное представление процесса для конкретного представления
- Служба задач для запроса и обновления задач
- Упаковка всех вызовов базы данных в транзакциях, поддерживаемых Spring
- Хранение деталей, таких как автор и URL, среди прочего, в Карта , и экономия с экземпляром процесса; они известны как переменные процесса, и мы можем получить к ним доступ в рамках определения процесса , как мы видели ранее
Теперь мы готовы протестировать наш движок приложений и процессов. Как только мы за начинаем приложение, мы можем просто использовать локон или любой клиент REST, как Почтальон, чтобы взаимодействовать с конечных точек мы создали.
6. Процессы тестирования единиц
Flowable поддерживает различные версии JUnit, включая JUnit 5, для создания унитарных тестов для бизнес-процессов. Flowable интеграции с Spring имеет подходящую поддержку для этого, как хорошо. Давайте посмотрим типичный унитарный тест для процесса весной:
@ExtendWith(FlowableSpringExtension.class) @ExtendWith(SpringExtension.class) public class ArticleWorkflowUnitTest { @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Test @Deployment(resources = { "processes/article-workflow.bpmn20.xml" }) void articleApprovalTest() { Mapvariables = new HashMap<>(); variables.put("author", "[email protected]"); variables.put("url", "http://baeldung.com/dummy"); runtimeService.startProcessInstanceByKey("articleReview", variables); Task task = taskService.createTaskQuery().singleResult(); assertEquals("Review the submitted tutorial", task.getName()); variables.put("approved", true); taskService.complete(task.getId(), variables); assertEquals(0, runtimeService.createProcessInstanceQuery().count()); } }
Это должно в значительной степени выглядеть как стандартный тест единицы весной, за исключением нескольких аннотаций, как @Deployment . Теперь, @Deployment аннотация предоставляется Flowable для создания и удаления развертывания процесса вокруг методов тестирования.
7. Понимание развертывания процессов
Хотя мы не будем освещать детали развертывания процессов в этом учебнике, стоит охватить некоторые аспекты, которые имеют важное значение.
Как правило, процессы архивируются как бизнес-архив (BAR) и развертываются в приложении . Во время развертывания этот архив сканируется на артефакты, такие как определения процессов, и обрабатывается. Возможно, вы заметили, что конвенция файла определения процесса заканчивается “.bpmn20.xml”.
Хотя мы использовали базу данных H2 по умолчанию в нашем учебнике, это на самом деле не может быть использовано в реальном приложении, по простой причине, что база данных памяти не будет хранить какие-либо данные через стартапы и практически невозможно использовать в кластерной среде! Следовательно, мы должны использовать реляционную базу данных производственного класса и предоставлять необходимые конфигурации в приложении .
Хотя BPMN 2.0 сам по себе не имеет никакого понятия о версии, Flowable создает атрибут версии для процесса, который развертывается в базе данных . При развертывании обновленной версии того же процесса, идентифицированной атрибутом “id”, создается новая запись с приращением версии. Когда мы пытаемся начать процесс с помощью “id”, движок процесса получает последнюю версию развернутого определения процесса.
Если мы используем один из дизайнеров, которые мы обсуждали ранее, чтобы создать определение процесса, у нас уже есть визуализация для нашего процесса. Мы можем экспортировать диаграмму процесса в качестве изображения и поместить ее рядом с файлом определения процесса XML. Если мы будем придерживаться стандартной название конвенции предложенное Flowable, это изображение будет обрабатываться двигателем процесса вместе с сам процесс. Кроме того, мы можем получить это изображение через API, а также!
8. История просмотра экземпляров процессов
Часто важно в случае бизнес-процессов понять, что происходило в прошлом. Возможно, нам это понадобится для простой отладки или сложных юридических целей аудита.
Flowable записывает, что происходит через выполнение процесса, и хранит его в базе данных. Кроме того, Flowable делает эту историю доступной через API для запроса и анализа. Есть шесть сущностей, под которыми Flowable записывает эти, и ИсторияСервис есть методы, чтобы запросить их все.
Давайте посмотрим простой запрос для получения готовых экземпляров процесса:
HistoryService historyService = processEngine.getHistoryService(); Listactivities = historyService .createHistoricActivityInstanceQuery() .processInstanceId(processInstance.getId()) .finished() .orderByHistoricActivityInstanceEndTime() .asc() .list();
Как мы видим, API для запроса записанных данных довольно композиционен. В этом примере мы запрашиваем готовые экземпляры процесса по идентификатору и заказываем их в порядке восходящего времени окончания.
9. Процессы мониторинга
Мониторинг является ключевым аспектом любого критически важного для бизнеса приложения, и тем более для обработки приложений бизнес-процессами организации. Flowable имеет несколько вариантов, чтобы позволить нам контролировать процессы в режиме реального времени.
Flowable предоставляет определенные MBeans, которые мы можем получить доступ через JMX , чтобы не только собирать данные для мониторинга, но и выполнять многие другие мероприятия. Мы можем интегрировать это с любым стандартным клиентом JMX, включая jconsole , который присутствует наряду со стандартными дистрибутивами Java.
Использование JMX для мониторинга открывает множество опций, но является относительно сложным и трудоемким. Однако, так как мы используем Весенняя загрузка, нам повезло!
Весенняя загрузка предлагает Actuator Конечные точки для сбора метрик приложений по HTTP. Мы можем легко интегрировать это с стеком инструментов, как Прометей и создать инструмент мониторинга производственного класса с минимальными усилиями.
Flowable предоставляет дополнительный Actuator Endpoint, разоблачающий информацию о запускаемых процессах. Это не так хорошо, как сбор информации через JMX, но это быстро, легко и, прежде всего, достаточно.
10. Заключение
В этом учебнике мы обсудили бизнес-процессы и как определить их в стандарте BPMN 2.0. Затем мы обсудили возможности движка процессов Flowable и API для развертывания и выполнения процессов. Мы видели, как интегрировать это в Java-приложении, особенно в Spring Boot.
Продолжая дальше, мы обсудили другие важные аспекты процессов, такие как их развертывание, визуализация и мониторинг. Излишне говорить, что мы только что поцарапал поверхность бизнес-процесса и мощный двигатель, как Flowable. Flowable имеет очень богатый API с достаточной документацией. Этот учебник, однако, должны были пробудить наш интерес к этому вопросу!
Как всегда, код для примеров доступен более на GitHub .