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 .