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

Введение в Activiti с весной

Узнайте, как использовать платформу управления рабочими процессами и бизнес-процессами с помощью Spring.

Автор оригинала: baeldung.

1. Обзор

Проще говоря, Activity-это платформа для управления рабочими процессами и бизнес-процессами.

Мы можем быстро начать работу, создав ProcessEngineConfiguration (обычно на основе файла конфигурации). Из этого мы можем получить ProcessEngine – и через ProcessEngine мы можем выполнять операции workflow & BPM.

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

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

Если вы новичок в API, ознакомьтесь с нашим Введением в Activiti API с Java . В этой статье мы обсудим, как мы можем настроить API-интерфейс в приложении Spring Boot.

2. Настройка С Помощью Пружинной Загрузки

Давайте посмотрим, как мы можем настроить Activity в качестве приложения Spring Boot Maven и начать его использовать.

2.1. Начальная настройка

Как обычно, нам нужно добавить зависимость maven:


    org.activiti
    activiti-spring-boot-starter-basic

Последнюю стабильную версию API можно найти здесь . Он работает с весенней загрузкой через v1.5.4. Он еще не работает с v2.0.0.M1.

Мы также можем создать проект Spring Boot с помощью https://start.spring.io и выберите Действие в качестве зависимости.

Просто добавив эту зависимость и аннотацию @EnableAutoConfiguration в приложение Spring Boot, он выполнит начальную настройку:

  • Создать источник данных (API требует базы данных для создания Process Engine )
  • Создайте и предоставьте ProcessEngine bean
  • Создание и предоставление компонентов служб действий
  • Создайте исполнителя весеннего задания

2.2. Создание и запуск процесса

Давайте построим пример создания и запуска бизнес-процесса.

Чтобы определить процесс, нам нужно будет создать файл BPMN. Для этого мы можем использовать https://activiti.alfresco.com/activiti-app/editor для создания определения процесса.

Затем просто загрузите файл BPMN. Нам нужно будет поместить этот файл в папку src/main/resources/processes . По умолчанию Spring Boot будет искать в этой папке для развертывания определения процесса.

Мы создадим демонстрационный процесс, содержащий задачи одного пользователя:

Назначенный пользовательской задачи назначается инициатором процесса. Файл BPMN для этого определения процесса выглядит следующим образом:

 
     
     
     
          
     
     
     
     
     
     

Теперь мы создадим контроллер REST для обработки запросов на запуск этого процесса:

@Autowired
private RuntimeService runtimeService;

@GetMapping("/start-process")
public String startProcess() {
  
    runtimeService.startProcessInstanceByKey("my-process");
    return "Process started. Number of currently running"
      + "process instances = "
      + runtimeService.createProcessInstanceQuery().count();
}

Здесь runtimeService.startProcessInstanceByKey(“мой-процесс”) запускает выполнение процесса, ключом которого является “мой-процесс” . runtimeService.createProcessInstanceQuery().count() даст нам количество экземпляров процесса.

Каждый раз , когда мы попадаем в путь “/start-process” , будет создан новый экземпляр Process , и мы увидим увеличение количества запущенных в данный момент процессов.

Тестовый случай JUnit показывает нам такое поведение:

@Test
public void givenProcess_whenStartProcess_thenIncreaseInProcessInstanceCount() 
  throws Exception {
 
    String responseBody = this.mockMvc
      .perform(MockMvcRequestBuilders.get("/start-process"))
      .andReturn().getResponse().getContentAsString();
 
    assertEquals("Process started. Number of currently running"
      + " process instances = 1", responseBody);
        
    responseBody = this.mockMvc
      .perform(MockMvcRequestBuilders.get("/start-process"))
      .andReturn().getResponse().getContentAsString();
 
    assertEquals("Process started. Number of currently running"
      + " process instances = 2", responseBody);
        
    responseBody = this.mockMvc
      .perform(MockMvcRequestBuilders.get("/start-process"))
      .andReturn().getResponse().getContentAsString();
 
    assertEquals("Process started. Number of currently running"
      + " process instances = 3", responseBody);
}

3. Игра С Процессами

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

3.1. Получить Список задач для Данного экземпляра процесса

У нас есть две пользовательские задачи A и B . Когда мы запускаем процесс, он будет ждать завершения первой задачи A , а затем выполнит задачу B . Давайте создадим метод обработчика, который принимает запросы на просмотр задач, связанных с заданным processInstance .

Объекты, такие как Task , не могут быть отправлены в качестве прямого ответа, и поэтому нам нужно создать пользовательский объект и преобразовать Task в наш пользовательский объект. Мы назовем этот класс Представление задачи :

class TaskRepresentation {
    private String id;
    private String name;
    private String processInstanceId;

    // standard constructors
}

Метод обработчика будет выглядеть следующим образом:

@GetMapping("/get-tasks/{processInstanceId}")
public List getTasks(
  @PathVariable String processInstanceId) {
 
    List usertasks = taskService.createTaskQuery()
      .processInstanceId(processInstanceId)
      .list();

    return usertasks.stream()
      .map(task -> new TaskRepresentation(
        task.getId(), task.getName(), task.getProcessInstanceId()))
      .collect(Collectors.toList());
}

Здесь TaskService.createTaskQuery().processInstanceId(processInstanceId).list() использует TaskService и возвращает нам список задач, связанных с данным processInstanceId . Мы видим, что, когда мы начнем запускать созданный нами процесс, мы получим задачу A , сделав запрос к методу, который мы только что определили:

@Test
public void givenProcess_whenProcessInstance_thenReceivedRunningTask() 
  throws Exception {
 
    this.mockMvc.perform(MockMvcRequestBuilders.get("/start-process"))
      .andReturn()
      .getResponse();
    ProcessInstance pi = runtimeService.createProcessInstanceQuery()
      .orderByProcessInstanceId()
      .desc()
      .list()
      .get(0);
    String responseBody = this.mockMvc
      .perform(MockMvcRequestBuilders.get("/get-tasks/" + pi.getId()))
      .andReturn()
      .getResponse()
      .getContentAsString();

    ObjectMapper mapper = new ObjectMapper();
    List tasks = Arrays.asList(mapper
      .readValue(responseBody, TaskRepresentation[].class));
 
    assertEquals(1, tasks.size());
    assertEquals("A", tasks.get(0).getName());
}

3.2. Выполнение задания

Теперь мы посмотрим, что произойдет, когда мы завершим задачу A . Мы создаем метод обработчика, который будет обрабатывать запросы на выполнение задачи A для данного processInstance :

@GetMapping("/complete-task-A/{processInstanceId}")
public void completeTaskA(@PathVariable String processInstanceId) {
    Task task = taskService.createTaskQuery()
      .processInstanceId(processInstanceId)
      .singleResult();
    taskService.complete(task.getId());
}

TaskService.createTaskQuery().processInstanceId(processInstanceId).single Result() создает запрос на службу задач и выдает нам задачу данного processInstance . Это Пользовательская задача A . Следующая строка TaskService.complete(task.getId) завершает эту задачу.
Следовательно, теперь процесс достиг конца, и Служба времени выполнения
не содержит никаких Экземпляров процесса
. Мы можем увидеть это, используя тестовый случай JUnit:

@Test
public void givenProcess_whenCompleteTaskA_thenNoProcessInstance() 
  throws Exception {

    this.mockMvc.perform(MockMvcRequestBuilders.get("/start-process"))
      .andReturn()
      .getResponse();
    ProcessInstance pi = runtimeService.createProcessInstanceQuery()
      .orderByProcessInstanceId()
      .desc()
      .list()
      .get(0);
    this.mockMvc.perform(MockMvcRequestBuilders.get("/complete-task-A/" + pi.getId()))
      .andReturn()
      .getResponse()
      .getContentAsString();
    List list = runtimeService.createProcessInstanceQuery().list();
    assertEquals(0, list.size());
}

Именно так мы можем использовать службы активности для работы с процессами.

4. Заключение

В этой статье мы рассмотрели обзор использования API Activiti с Spring Boot . Более подробную информацию об API можно найти в руководстве пользователя . Мы также увидели, как создать процесс и выполнить над ним различные операции с помощью служб Activity services.

Spring Boot упрощает его использование, так как нам не нужно беспокоиться о создании базы данных, развертывании процессов или создании ProcessEngine .

Имейте в виду, что интеграция Activiti с Spring Boot все еще находится в экспериментальной фазе и еще не поддерживается Spring Boot 2.

Как всегда, реализацию всех примеров, которые мы видели, можно найти на GitHub .