### 1 End terminate event - https://stormbpmn.com/bpmn/elements/end-terminate-throw-event - https://elma365.com/ru/bpmn2/10_4_3/ ### 2 None End Event vs Terminate End Event Спецификация BPMN 2.0 однозначно трактует завершение процесса через призму **жизненного цикла токенов**. #### Правило 1: Завершение Процесса (Process Completion) Согласно спецификации (раздел 13.2.5 "Process Completion"): > **Процесс завершается, когда не остается активных токенов.** > (A Process Instance is completed when there are no more Tokens in the Process Instance.) Это фундаментальное правило. Пока в процессе существует хотя бы один активный токен (где бы он ни находился: в задаче, в событии, на потоке), экземпляр процесса считается активным и не может быть завершен. **Cценарий:** Если в процессе после разветвления существует несколько токенов, и один из них достигает конечного события, происходит следующее: * Этот конкретный токен **уничтожается (consumed)** upon arrival at the End Event. * Все остальные токены продолжают свой путь по своим веткам процесса. * Процесс остается активным до тех пор, пока ВСЕ токены не будут уничтожены, достигнув своих конечных событий. #### Правило 2: Поведение Конечных Событий (End Event Behavior) Здесь критически важен тип конечного события. Спецификация разделяет: * **None End Event (Обычное конечное событие, без маркера):** * Действие: "Завершение потока (Throw)". Это означает, что событие просто "срабатывает". * Результат: **Уничтожает только тот токен, который в него вошел.** На другие токены в процессе оно не влияет. * *Это поведение по умолчанию для вашего сценария.* * **Terminate End Event (Терминирующее конечное событие, с черным кружком внутри):** * Действие: "Прерывание (Terminate)". * Результат: **Немедленно завершает весь экземпляр процесса, включая все активные токены во всех его ветках.** Это единственное событие, которое имеет такое глобальное воздействие. Спецификация (раздел 10.2.6 "Terminate End Events") гласит: > When a Token arrives at a Terminate End Event, **the entire Process Instance is terminated immediately**. This means that all Tokens in the Process Instance in any Node are destroyed and no more Activitiеs will be executed. --- ### Ссылки на спецификацию BPMN 2.0 (OMG, формальная версия) * **Process Completion:** Смотрите раздел `13.2.5 Process Completion` в документации BPMN 2.0 от OMG. В нем прямо указано, что процесс завершается, когда "no tokens are present". * **Terminate End Event:** Смотрите раздел `10.2.6 Terminate End Events`. В нем явно описано поведение "immediate termination of the entire process instance". ### Практический пример Рассмотрим простой процесс с параллельным шлюзом (Parallel Gateway): ``` [Старт] -> [Параллельный шлюз] -> (Ветка А: Задача 1 -> Конечное Событие 1) -> (Ветка Б: Задача 2 -> Конечное Событие 2) ``` 1. Токен из Старта достигает параллельного шлюза и размножается на два токена: Токен_А и Токен_Б. 2. Токен_А быстро проходит Задачу 1 и достигает **Конечного События 1 (None End Event)**. * **Результат:** Токен_А уничтожается. Ветка А завершена. Однако Токен_Б все еще выполняет Задачу 2. **Процесс остается активным.** 3. Токен_Б завершает Задачу 2 и достигает Конечного События 2. * **Результат:** Токен_Б уничтожается. Теперь в процессе не осталось активных токенов. **Только сейчас весь процесс считается завершенным.** **Если бы Конечное Событие 1 было `Terminate End Event`**, то в момент его достижения Токеном_А весь процесс был бы немедленно прерван, а Токен_Б был бы уничтожен, где бы он ни находился (даже внутри Задачи 2). ### Вывод 1. **Основное правило:** Процесс завершается, когда количество активных токенов становится равным нулю. 2. **Обычное конечное событие (None End Event):** Уничтожает только свой токен. Не влияет на другие токены. 3. **Терминирующее конечное событие (Terminate End Event):** Немедленно завершает весь экземпляр процесса, уничтожая все токены. Таким образом, в сценарии с размноженными токенами процесс не завершится при завершении первого из них, если только это не специальное терминирующее событие.