Жизненный цикл событий и команд

../../_images/process_engine_lifecycle_commands.png

Если к нам приходит внешнее событие (например, кейс создан), то мы опрашиваем хранилище на наличие заинтересованных в этом событии слушателей. У каждого слушателя может быть некоторое условие срабатывания и должна быть команда, которую следует выполнить если произошло событие, которое удовлетворяет условию (если условие отсутствует, то оно считается всегда успешно пройденным).

При поступлении команды (пользовательской или по событию) мы начинаем транзакцию (БД не поддерживает транзакционность и у нас будет свой механизм для этого). После того как транзакция началась мы читаем нужные данные (если таковые имеются) из БД и сохраняем их в памяти. Далее при любом чтении данных мы ищем их в памяти и только если не нашли, то обращаемся в БД.

После получения нужных данных мы запускаем жизненный цикл активностей в ходе которого могут завершиться и начаться неограниченное количество активностей (задач, действий, этапов). Данные в этот момент все хранятся только в памяти. Если все действия прошли успешно, то мы сохраняем состояние процесса в БД, выполняем действия, которые должны выполниться после коммита (например, отправка уведомлений) и отправляем события во внешние системы.