Официальная документация
https://docs.camunda.org/manual/7.18/user-guide/process-engine/process-engine-api/
Ниже приведены некоторые документы с официального сайта. Если у вас есть время, вы можете посмотреть. Вот некоторые основные вещи.
Это механизм процессов, с помощью которого вы можете получать сопутствующие услуги. Он объединяет множество сопутствующих услуг. Реализация по умолчанию следующая.
**RepositoryService **Эта служба обеспечивает операции по управлению и эксплуатации развертываний и определений процессов, что является первым приоритетом при использовании camunda.
**RuntimeService **Связано с запуском, запуском экземпляров процесса, удалением, поиском и т. д.
**TaskService **Все операции, связанные с задачами, такие как завершение, распространение, утверждение и т. д.
HistoryService Предоставлять услуги исторических данных, собранных двигателями
IdentityService Связан с пользователем, редко используется на практике
Зависит от интеграции maven
При необходимости вы можете указать версию, я использую здесь 7.18. Требуются три зависимости maven, которые соответствуют механизму процессов, платформе веб-управления и пакету интерфейса операции rest API.
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter</artifactId>
<version>7.18.0</version>
</dependency>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
<version>7.18.0</version>
</dependency>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
<version>7.18.0</version>
</dependency>
база данных Я использую здесь MySQL и создал новую базу данных. camunda (настраиваемый), необходимая структура таблицы будет автоматически сгенерирована после запуска
POM-файл
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>camunda-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>camunda-demo</name>
<description>camunda-demo</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter</artifactId>
<version>7.18.0</version>
</dependency>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
<version>7.18.0</version>
</dependency>
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
<version>7.18.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
server:
port: 8081
# информация для входа в камунду Конфигурация
camunda.bpm:
admin-user:
id: admin #имя пользователя
password: 123456 #пароль
firstName: yu
filter:
create: All tasks
# информация о соединении MySQL
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:8101/camunda
username: root
password: 123456
type: com.mysql.cj.jdbc.MysqlDataSource
Подготовьте подготовительные работы, а эффект после запуска следующий:
база данныхструктура таблицы
Структура таблицы, автоматически создаваемая после запуска, выглядит следующим образом.
Вероятно, существует несколько модулей таблиц. Наиболее важные из них представлены подробно:
Эта часть представляет пользовательский модуль. Информация о пользователе в файле конфигурации находится в этом модуле.
Представляет историю процесса
act_hi_actinst
: История выполненных работact_hi_taskinst
:История выполнения задачact_hi_procinst
:История экземпляров процесса выполненияact_hi_varinst
:процесспеременнаятаблица историиПредставляет хранилище ресурсов процесса
act_re_procdef
:процесс Определить хранилищеact_re_deployment
: Автоматическое развертывание, Springboot будет повторно развертываться при каждом запуске и генерировать записи.Представляет данные таблицы во время выполнения процесса и будут удалены после завершения процесса.
act_ru_execution
:время выполненияпроцесс Примерact_ru_task
:Задачи времени выполненияact_ru_variable
:время выполнения的процесспеременнаяОбработка общих данных
act_ge_bytearray
:Файлы для каждого развертывания2шестнадцатеричные данные,Итак, после изменения файла if,Перезагрузка бесполезна,Потому что запись была восстановлена,Нужно очистить базу данные или эта запись таблицыИнтерфейс входа в систему
Адрес для входа http://localhost:8081/
,Введите имя пользователя и пароль admin,123456 в файле конфигурации.
главная консоль
После успешного входа в систему, как показано ниже, ниже описывается конкретное использование.
скачать Сначала вам нужен инструмент Camunda Modeler Приходите и рисуйте, скачать адрес:
После распаковки откройте его следующим образом:
рисовать
Создать новый
Я немного нарисовал здесь. Не буду вдаваться в подробности, как это нарисовать. Конечный эффект следующий: имитация процесса ОА.
Классификация задач
Представлены только два наиболее часто используемых из них.
Конкретно это задача, которую нужно выполнить вручную, то есть после того, как мы написали бизнес-код, нам нужно вызвать код
taskService.complete(taskId, variables);
задачи, которые будут выполнены
Система автоматически поможет нам выполнить задания
шлюз
Разделенные на несколько категорий, они будут обрабатываться в соответствии с передаваемыми нами переменными процесса и заданными нами условиями.
Этот шлюз будет идти только в одну сторону,Когда мы подошли к этому шлюзу,Он найдет первую задачу, отвечающую условиям, сверху вниз и спустится вниз.
Этот шлюз не требует установки условий и выполнит все задачи.
Этот шлюз возьмет на себя одну или несколько задач, соответствующих условиям
Пример
Как показано выше содержит шлюз, в шлюзе задается условие выражения, а параметры задаются из переменных процесса
Два параметра:
switch2d 、 switch3d
Сохраните нарисованный файл блок-схемы как test_1.bpmn, resourcesСоздать в проекте Springboot прямо сейчас новая папка bpmn,вставить,
Перезапустите проект и обнаружите, что веб-интерфейс интегрирован.
Напишите несколько тестовых контроллеров и сервисов.
controller
service
public void startProcess() {
ProcessInstance instance = runtimeService.startProcessInstanceByKey("key");
System.out.println(instance.toString());
}
public List<ProcessDefinition> findProcesses() {
return repositoryService.createProcessDefinitionQuery().list();
}
public List<Task> findTasks() {
return taskService.createTaskQuery().list();
}
Процесс запуска прошел успешно, что указывает на то, что проблема не является серьезной. Далее будут внесены детальные улучшения бизнеса.
В следующей статье представлена подробная бизнес-интеграция и использование различных API (передача переменных, автоматические задачи).
Использование API
API, связанный с процессом
Процесс создания:
Первая задача будет создана одновременно
ProcessInstance instance = runtimeService.startProcessInstanceByKey(processKey, params);
приостановить процесс
После приостановки процесса будет сообщено об ошибке, если соответствующие задачи будут выполнены снова, и сначала задачу необходимо повторно активировать.
runtimeService.suspendProcessInstanceById(instance.getId());
Процесс реактивации
runtimeService.activateProcessInstanceById(instance.getId());
удалить процесс
Задачи также будут удалены.
runtimeService.deleteProcessInstance(instance.getId(), «Удалить вручную»);
Все вышеперечисленное можно найти в таблице истории процессов. act_hi_procinst
Запрос здесь
API, связанный с задачами
Для классов запросов на основе служб вы можете сначала создать запрос, а затем прикрепить условия запроса и несколько примеров.
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").list();
List<ProcessInstance> instances = runtimeService.createProcessInstanceQuery().listPage(1, 10);
Запрос исторических задач
List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().list();
Запросить текущую задачу/нумерацию страниц
List<Task> list = taskService.createTaskQuery().orderByTaskCreateTime().desc().list();
Откат задачи
Общая идея состоит в том, чтобы получить текущую задачу и предыдущую историческую задачу текущей задачи, а затем перезапустить
Пример кода
Task activeTask = taskService.createTaskQuery()
.taskId(taskId)
.active()
.singleResult();
List<HistoricTaskInstance> historicTaskInstance = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(instanceId)
.orderByHistoricActivityInstanceStartTime()
.desc()
.list();
List<HistoricTaskInstance> historicTaskInstances = historicTaskInstance.stream().filter(v -> !v.getTaskDefinitionKey().equals(activeTask.getTaskDefinitionKey())).toList();
Assert.notEmpty(historicTaskInstances, «Это уже начальная задача!»);
HistoricTaskInstance curr = historicTaskInstances.get(0);
runtimeService.createProcessInstanceModification(instanceId)
.cancelAllForActivity(activeTask.getTaskDefinitionKey())
.setAnnotation("Повторное выполнение")
.startBeforeActivity(curr.getTaskDefinitionKey())
.execute();
Включает переменную информацию, генерируемую в ходе процесса.,В том числе и переменная, контролирующая течение процессов,шлюз, переменная и т. д., необходимые для процесса заполнения бизнес-формы. Используется во многих местах
Передача переменной процесса
Переменные в конечном итоге будут существовать act_ru_variable
внутри этой таблицы
существоватьрисоватьпроцесскогда рисуешь,еслида Пользовательские задачи(userService) Вы можете установить переменные, такие как исполнитель,
Есть несколько способов написать
${user}
,Для этого необходимо передать параметры,Фактически, он передается при запуске параметров.,Передать параметры,Необязательное значение — одноMap<String, Object>
,Вы можете проверить вторичные параметры в последующем процессе.,То, что написано выше, это пользователь, Следовательно, ключ в карте должен содержать пользователя, иначе будет сообщено об ошибке.О расширении переменная,Это можно установить в блок-схеме рисунка.,Способ доставки остался прежним.,В блок-схеме это написано ниже:
Код:
ProcessInstance instance = runtimeService.startProcessInstanceByKey(key, new HashMap<>());
Переменные настройки
runtimeService.setVariable(instance.getId(), Constants.PATIENT_ID, relatedId);
Переменный запрос
Object variable = runtimeService.getVariable(instance.getId(), Constants.GENERAL_ID);
история Переменный запрос
Переменная HistoricVariableInstanceInstance = HistoryService.createHistoricVariableInstanceQuery().processInstanceId(bo.getId().toString()).
Имя переменной(Константы.PATIENT_ID).singleResult();
//переменнаяценить
переменнаяInstance.getValue();
//переменная имя
переменнаяInstance.getName();
Есть два основных типа задач для бэкэнда.
UserTask-userTask
То есть задачи, требующие участия пользователя, поскольку процесс выполнения рабочего процесса должен включать в себя такие задачи, как утверждение и проверка, требующие участия пользователя. В это время пользователям необходимо участвовать, а затем вызывать интерфейс для выполнения задачи.
Задача службы-serviceTask
То есть задачи, которые выполняются автоматически, например задачи, которые система автоматически сохраняет, изменяет статус и т. д. после отправки пользователем.
Type
Тип задачи является ключевым. Вы можете вызывать методы Java, методы Spring Bean и т. д. в соответствии с соответствующей конфигурацией. Существует несколько типов.
Рекомендуется использовать – Делегированное выражение!!!
В системных задачах, поскольку они выполняются автоматически, различную бизнес-логику необходимо внедрять в реальные приложения. В конструкции блок-схемы вы можете вызвать Java-код для выполнения следующим образом и настроить bean-компонент с тем же именем весной.
Выражения конфигурации можно использовать для настройки интерфейса JavaDelegate с использованием имен классов. Следующий метод более рекомендуется. Этот тип позволяет гибко настраивать bean-компоненты и Spring для внедрения бизнес-методов, таких как службы.
@Bean("t17")
JavaDelegate t17() {
return execution -> {
Map<String, Object> variables = execution.getVariables();
Task task = taskService.createTaskQuery().processInstanceId(execution.getProcessInstanceId()).singleResult();
//Бизнес-логика
task.setOwner(String.valueOf(dentistId));
};
}
Java Class :
Чтобы настроить имя класса Java, вам необходимо реализовать интерфейс JavaDelegate. Обратите внимание, что это полное имя. Вы не можете использовать конфигурацию bean-компонента Spring! ! !
@Component
public class T17Delegate implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) throws Exception {
String taskId = execution.getId();
String instanceId = execution.getProcessInstanceId();
Map<String, Object> variables = execution.getVariables();
}
}
Следующие две конфигурации могут использоваться с пружиной
Expression:
Выражение EL, вызывающий метод класса Java, спецификация:
expression=“#{monitorExecution.execution(execution)}”
@Component("monitorExecution")
public class MonitorExecution {
public void execution(DelegateExecution execution){
String processInstanceId = execution.getProcessInstanceId();
}
}
Прослушиватели задач используются для выполнения пользовательской логики или выражений Java при возникновении определенного события, связанного с задачей. Его можно добавить только в определение процесса как дочерний элемент пользовательской задачи.
Обратите внимание, что это также должно происходить как дочерний элемент расширения BPMN 2.0 и внутри пространства имен Camunda, поскольку прослушиватели задач созданы специально для механизма Camunda.
Применимые сценарии:
@Bean
TaskListener t21() {
return delegateTask -> {
String taskId = delegateTask.getId();
String instanceId = delegateTask.getProcessInstanceId();
Map<String, Object> variables = delegateTask.getVariables();
// TODO: 20log/3/22
delegateTask.setVariable("", "");
};
}
Прослушиватели выполнения выполняют внешний код Java или оценивают выражения, когда во время выполнения процесса происходят определенные события. Его можно использовать в любой задаче. События, которые можно зафиксировать:
Применяемые сценарии: установка хода выполнения задачи в конце каждой задачи.
public class ExampleExecutionListenerOne implements ExecutionListener {
public void notify(DelegateExecution execution) throws Exception {
execution.setVariable("variableSetInExecutionListener", "firstValue");
execution.setVariable("eventReceived", execution.getEventName());
}
}
Расширенные атрибуты подходят для многих настраиваемых бизнес-атрибутов, таких как настройка хода бизнес-процесса.
IdentityService — это служба, связанная с аутентификацией, но в нашей фактической разработке мы обычно используем нашу собственную систему аутентификации, поэтому ее можно настроить с помощью API, предоставленного camunda. Подробности см. в классе IdentityServiceImpl, который также использует ThreadLocal для сохранения аутентификации. Информация, код ниже.
private ThreadLocal<Authentication> currentAuthentication = new ThreadLocal<Authentication>();
Настройки информации о пользователе:
// Userutil — это наш собственный инкапсулированный класс пользовательских инструментов.
identityService.setAuthenticatedUserId(UserUtil.getUserId().toString());
//Получать
Authentication authentication = identityService.getCurrentAuthentication();
Он имеет множество встроенных функций, например, при запуске процесса,По умолчанию будет найден человек, вошедший в систему.,Этот классDefaultHistoryEventProducer
// set super process instance id
ExecutionEntity superExecution = executionEntity.getSuperExecution();
if (superExecution != null) {
evt.setSuperProcessInstanceId(superExecution.getProcessInstanceId());
}
//state
evt.setState(HistoricProcessInstance.STATE_ACTIVE);
// set start user Id
evt.setStartUserId(Context.getCommandContext().getAuthenticatedUserId());
//Установим исполнителя по идентификатору задачи
TaskService.setAssignee(task.getId(), UserUtil.getUserId().toString());