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 ListgetTasks( @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(); Listtasks = 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(); Listlist = 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 .