Паттерны BPMN #4. Компенсация неудачного развития процесса
Представьте, что вам нужна командировка в Сан-Франциско. Для путёвки вы заказали самолёт и гостиницу. Агентство пытается списать у вас деньги за самолёт и гостинцу, и их не хватает. А значит нужно отменить и гостиницу, и самолёт. Как это нарисовать в BPMN (и не умереть со шлюзами)?
Посмотрите схему
Выглядит всё интуитивно, но слегка необычно для BPMN.
Давайте разбираться.
Символ компенсации в BPMN
В BPMN имеется специальный символ, который может нам помочь.
Как вы видите, всего 4 типа возможного использования:
- стартовое прерывающее событие компенсации для подпроцессов, т.е. может запускать новые подпроцессы, прерывая поток в текущем.
- прикреплённое прерывающее промежуточное событие ожидания компенсации (как звучит-то!), т.е. может запускаться с прерыванием действия, к которому прикреплено. В этом смысле компенсация — это необычное событие, оно отбросит токен назад.
- промежуточное событие отправки компенсации, т.е. может запустить отправку компенсации туда, где её ждут.
- завершающее событие отправки компенсации, т.е. может запустить отправку компенсации и прервать текущий процесс.
Посмотрите гифку с токеном (подпишитесь на рассылку, если не знаете что это) и всё поймёте:
Итак, с помощью компенсации можно «что-то исправить» , когда процесс понял, что для этого появилась причина. Одна компенсация заменяет несколько шлюзов и потоков управления.
О компенсации из стандарта
BPMN обладает строгой семантикой, за это я его и люблю. Поэтому вот словесная часть правил работы компенсации, о которых обязательно надо знать:
- событие компенсации запустится столько раз, сколько раз было вызвано действие;
- компенсация из подпроцесса не будет передана в вышестоящий процесс;
- компенсация обрабатывается событийным подпроцессом. Если внутри подпроцесса предусмотрено стартовое прерывающее событие компенсации для подпроцессов, то будет запущено оно;
- компенсация запускается в обратном порядке. Последнее завершенное действие компенсируется первым;
- компенсация запустится только по завершённым действиям;
- компенсация соединяется с обработчиком с помощью потока ассоциации, а не через поток управления (как обычно).
Ну и?
Компенсация спасёт много времени и сделает ваши диаграммы более читаемыми, но используйте её с умом — подготовьте начинающего читателя вашей схемы, расскажите ему как этот символ работает (ссылкой на эту статью, например). Иначе вас заставят всё перерисовывать на шлюзах и действиях.
Комментарии