Розроблення BPMN-процесів через Camunda
Camunda — платформа для оркестрації бізнес-процесів на основі стандарту BPMN 2.0. Підходить для довгострокових робочих процесів із залученням людей (Human Tasks), зовнішніх сервісів та складної умовної логіки. На відміну від черг повідомлень, Camunda надає візуалізацію стану кожного екземпляра процесу.
Коли потрібен Camunda
- Процеси тривають години/дні/тижні (кредитна заявка, онбординг співробітника)
- У процесі беруть участь люди — потрібен UI для завдань
- Необхідна трасування аудиту: хто прийняв яке рішення та коли
- Умовна маршрутизація по бізнес-правилам
- Компенсації при збоях (як Saga Pattern)
BPMN-діаграма: обробка кредитної заявки
[Start Event: Заявка отримана]
│
[Service Task: Перевірити кредитну історію]
│
[Gateway (XOR): Кредитний скор > 600?]
│ │
Так Ні
│ │
[User Task: [End Event:
Затвердження Відмова]
менеджером]
│
[Gateway (XOR): Рішення менеджера?]
│ │
Затверджено Відхилено
│ │
[Service Task: [End Event: Відмова]
Видати кредит]
│
[End Event: Успіх]
Camunda 8 (SaaS) vs Camunda 7 (self-hosted)
| Camunda 8 | Camunda 7 | |
|---|---|---|
| Рушій | Zeebe (cloud-native) | Java Process Engine |
| Розгортання | SaaS або self-hosted | Self-hosted (Spring Boot) |
| Worker | External Task Workers | Java/External |
| Масштабування | Горизонтальне | Вертикальне |
| Ліцензія | Freemium | Apache 2.0 (community) |
Spring Boot + Camunda 7
<!-- pom.xml -->
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter</artifactId>
<version>7.20.0</version>
</dependency>
// Розгортання BPMN з classpath
@Configuration
public class ProcessEngineConfig {
@Bean
public ProcessEnginePlugin deployProcesses() {
return new ProcessEnginePlugin() {
@Override
public void postInit(ProcessEngineConfigurationImpl config) {
config.setDeploymentResources(new String[] {
"classpath*:processes/*.bpmn"
});
}
};
}
}
Реалізація Service Task:
@Component("creditCheckDelegate")
public class CreditCheckDelegate implements JavaDelegate {
@Autowired
private CreditBureauService creditBureauService;
@Override
public void execute(DelegateExecution execution) throws Exception {
String applicantId = (String) execution.getVariable("applicantId");
CreditReport report = creditBureauService.getReport(applicantId);
// Записати результати у змінні процесу
execution.setVariable("creditScore", report.getScore());
execution.setVariable("creditHistory", report.toJson());
execution.setVariable("scoreApproved", report.getScore() >= 600);
}
}
User Task — завдання для менеджера:
@RestController
@RequestMapping("/tasks")
public class TaskController {
@Autowired
private TaskService taskService;
@GetMapping("/manager")
public List<TaskDto> getManagerTasks() {
return taskService.createTaskQuery()
.taskCandidateGroup("credit-managers")
.active()
.list()
.stream()
.map(task -> new TaskDto(
task.getId(),
task.getName(),
runtimeService.getVariables(task.getProcessInstanceId())
))
.toList();
}
@PostMapping("/{taskId}/complete")
public void completeTask(@PathVariable String taskId,
@RequestBody TaskDecisionDto decision) {
taskService.complete(taskId, Map.of(
"managerDecision", decision.getDecision(),
"managerComment", decision.getComment(),
"decidedBy", getCurrentUser().getEmail()
));
}
}
Camunda 8 з Zeebe Java Client
@Component
public class CreditCheckWorker {
@JobWorker(type = "credit-check")
public void handleCreditCheck(final JobClient client, final ActivatedJob job) {
var variables = job.getVariablesAsMap();
String applicantId = (String) variables.get("applicantId");
try {
CreditReport report = creditBureauService.getReport(applicantId);
client.newCompleteCommand(job.getKey())
.variables(Map.of(
"creditScore", report.getScore(),
"scoreApproved", report.getScore() >= 600
))
.send()
.join();
} catch (Exception e) {
client.newFailCommand(job.getKey())
.retries(job.getRetries() - 1)
.errorMessage(e.getMessage())
.send()
.join();
}
}
}
DMN — таблиці бізнес-правил
Camunda підтримує DMN для складних умов без коду:
| creditScore | loanAmount | employmentYears || decision |
|-------------|------------|-----------------||----------- |
| >= 750 | <= 5000000 | >= 1 || approved |
| >= 700 | <= 2000000 | >= 2 || approved |
| >= 650 | <= 1000000 | >= 3 || manual |
| < 650 | - | - || rejected |
DMN-таблиця викликається в Service Task:
DmnDecisionResult result = decisionService.evaluateDecisionByKey("credit-decision")
.variables(execution.getVariables())
.evaluate();
execution.setVariable("decision", result.getSingleEntry());
Моніторинг через Cockpit
Camunda Cockpit — UI для моніторингу процесів: активні екземпляри, завислі завдання, інциденти, аудит змінних.
Строки виконання
- Один BPMN-процес з 3–5 Service Tasks та 1–2 User Tasks — 2–3 тижні
- DMN-таблиці для бізнес-правил — 3–5 днів
- Повна система з кількома процесами та Cockpit — 1–3 місяці







