mirror of
https://github.com/bpmbpm/doc.git
synced 2026-04-29 12:00:42 +00:00
68 lines
6.4 KiB
Markdown
68 lines
6.4 KiB
Markdown
### 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):** Немедленно завершает весь экземпляр процесса, уничтожая все токены.
|
||
|
||
Таким образом, в сценарии с размноженными токенами процесс не завершится при завершении первого из них, если только это не специальное терминирующее событие.
|