Ответ
Activiti — это open-source Java-фреймворк и движок бизнес-процессов (BPM), реализующий спецификацию BPMN 2.0 (Business Process Model and Notation). Он предназначен для моделирования, исполнения и мониторинга бизнес-процессов внутри приложений.
Ключевые концепции:
- BPMN 2.0: Стандартная нотация для описания процессов (задачи, шлюзы, события, потоки).
- Process Engine: Ядро, которое разворачивает BPMN-диаграммы и управляет жизненным циклом экземпляров процессов.
- База данных: Activiti сохраняет состояние процессов в реляционную БД (H2, PostgreSQL, MySQL и др.), обеспечивая персистентность и возможность кластеризации.
Основные сервисы ядра:
| Сервис | Назначение |
|---|---|
RepositoryService |
Управление развертыванием BPMN-моделей (.bpmn20.xml файлы). |
RuntimeService |
Запуск новых экземпляров процессов и управление ими. |
TaskService |
Работа с пользовательскими задачами (создание, завершение, назначение). |
HistoryService |
Доступ к историческим данным о выполненных процессах и задачах. |
Базовый пример инициализации и запуска процесса:
// 1. Создание ProcessEngine (часто через Spring Boot Starter)
ProcessEngine processEngine = ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration()
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE)
.buildProcessEngine();
// 2. Развертывание процесса из BPMN-файла
RepositoryService repoService = processEngine.getRepositoryService();
Deployment deployment = repoService.createDeployment()
.addClasspathResource("onboarding-process.bpmn20.xml")
.deploy();
// 3. Запуск экземпляра процесса
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<>();
variables.put("employeeName", "John Doe");
ProcessInstance instance = runtimeService.startProcessInstanceByKey("employeeOnboarding", variables);
Типичные сценарии использования: автоматизация workflow (согласование заявок, онбординг сотрудников), оркестрация микросервисов, выполнение сложных последовательностей бизнес-правил.
Ответ 18+ 🔞
Слушай, ну вот есть такая штука — Activiti. Представь себе, что это такой здоровенный, блядь, ящик с инструментами на Java, который умеет превращать красивые картинки с квадратиками и стрелочками в реально работающую, ёпта, логику. Эти картинки — они по науке называются BPMN 2.0, но если по-простому, то это инструкция для движка: "Вася, сделай вот это, потом спроси у Пети, а если Петя сказал "да", то иди нахуй в бухгалтерию".
Самое главное, что нужно понять:
- BPMN 2.0: Это как алфавит, на котором пишут сценарии для этого движка. Все эти "задачи", "шлюзы" (это которые "если-то") и "события" — его буквы.
- Process Engine: Это и есть сам Василий, ёбаный в рот, исполнитель. Он берет сценарий, садится на базу данных (PostgreSQL, MySQL — неважно) как на трон и начинает всем рулить. И всё состояние — кто что сделал, на каком шаге завис — он аккуратно в эту базу записывает. Персистентность, блядь, называется. Чтобы если сервер упал, он, поднявшись, не начал всё с чистого листа, а продолжил с того места, где все обосрались.
- Сервисы: А это уже ручки управления этим Васей. Каждая — за свою часть отвечает.
Вот смотри, какие у него кнопки есть:
| Кнопка (Сервис) | За что отвечает (по-человечески) |
|---|---|
RepositoryService |
Таскает и загружает в движок эти самые BPMN-схемы (файлы .bpmn20.xml). Грубо говоря, даёт Василию инструкцию в руки. |
RuntimeService |
Нажимает красную кнопку "Старт" для нового экземпляра процесса. "Вась, начинай отрабатывать вот этот сценарий для сотрудника Джона". |
TaskService |
Работает с человеческими задачами. "Вась, создай задачу для Пети", "Вась, Петя задачу выполнил, засунь её в историю". |
HistoryService |
Это стукач и архивариус. К нему можно прийти и спросить: "А что Вася делал в прошлый вторник? А почему процесс №666 завис?". Он всё расскажет. |
Ну и как это, блядь, выглядит в коде? Да элементарно, ёпта!
// 1. Рождаем нашего Васю (ProcessEngine). Чаще всего его Spring Boot сам выкармливает.
ProcessEngine processEngine = ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration() // Создаём для теста в памяти
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE) // "Вася, если таблиц нет — нарисуй их сам"
.buildProcessEngine();
// 2. Даём Васе инструкцию (разворачиваем процесс)
RepositoryService repoService = processEngine.getRepositoryService();
Deployment deployment = repoService.createDeployment()
.addClasspathResource("onboarding-process.bpmn20.xml") // Вот схема "Приём нового сотрудника"
.deploy(); // Готово, Вася её выучил
// 3. Кричим "Вася, поехали!" (запускаем экземпляр процесса)
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<>();
variables.put("employeeName", "John Doe"); // Передаём данные: имя новичка — Джон
ProcessInstance instance = runtimeService.startProcessInstanceByKey("employeeOnboarding", variables);
// Всё. Процесс попёр. Теперь Вася будет тыкать Джона задачами и гонять по инстанциям.
А где это, сука, применяется? Да везде, где есть какая-то процедура, в которой больше одного шага и одного человека! Автоматизация согласования отпусков или закупок, онбординг сотрудников (как в примере), оркестрация кучи микросервисов, чтобы они друг другу не насрали в тапки при выполнении сложной операции. Короче, для любых workflow, где нужно чтобы всё текло по правилам, а не как обычно — кто во что горазд.