Что такое Activiti и для чего он используется?

Ответ

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, где нужно чтобы всё текло по правилам, а не как обычно — кто во что горазд.