Рубрики
Без рубрики

Введение в Flowable

Быстрый и практичный обзор Flowable с spring Boot.

Автор оригинала: 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:

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 List
getTasks(@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) {
        Map variables = 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() {
        Map variables = 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();
List activities = 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 .