Аналитики, начинающие работать с Camunda BPM, часто задают один и тот же вопрос – чем Событие получения сообщения (Message Catch Event) отличается от Задачи получения сообщения (Receive Task)?
Давайте разбираться!
Общие принципы
Бизнес-процессы могут обмениваться друг с другом информацией в асинхронном режиме при помощи сообщений (Messages). И Message Catch Event, и Receive Task указывают на то, что в данном месте процесса ожидается получение сообщения (корреляция процесса) от внешнего участника (Participant). Под сообщением может подразумеваться электронное сообщение, документ, данные из Middleware и т.д – нотация BPMN отдает реализацию на откуп разработчика конкретной системы.
В Camunda, когда токен процесса достигает Message Catch Event или Receive Task, выполнение процесса приостанавливается, а его контекст сохраняется в базу (flush). После получения сообщения выполнение процесса возобновляется. Кроме того, поступившее сообщение может установить новые значения переменных процесса.
Расположение в процессе
A Receive Task is often used to start a Process. In a sense, the Process is bootstrapped by the receipt of the Message. In order for the Receive Task to instantiate the Process its instantiate attribute MUST be set to true and it MUST NOT have any incoming Sequence Flow. © BPMN.
Несмотря на то, что нотация BPMN разрешает запускать процесс при помощи Receive Task, Camunda BPM не даст загрузить описание процесса без стартового события, выдав ошибку:
* process must define a startEvent element
Таким образом, мы приходим к первому отличию:
- Message Catch Event позволяет как запускать процесс, так и коррелировать (получать промежуточные сообщения), а Receive Task - только коррелировать.
Прикрепленные события
Поскольку Receive Task представляет собой Активность (Activity), он может иметь так называемое прикрепленное событие (Attached Event), позволяющее текущую активность прервать или как-то дополнительно обработать без прерывания.
Отличие 2: Receive Task может иметь прикрепленные события, а Message Catch Event - нет.
Развилка по событию (Event Gateway)
Как при помощи только событий реализовать логику, описанную на диаграмме выше ("Ждем сообщения 10 дней и уходим, если не дождались")?
На помощь приходит развилка по событиям (Event Gateway):
Однако, в силу архитектурных особенностей, Camunda не позволяет разместить за развилкой по событию Receive Task, выдавая при загрузке модели процесса ошибку:
ENGINE-09005 Could not parse BPMN process. Errors:
* Event based gateway can only be connected to elements of type intermediateCatchEvent
Из чего следует Отличие 3: Message Catch Event может располагаться за Event Gateway, а Receive Task – нет.
Итоги
Событие получения сообщения (Message Catch Event) и Задача получения сообщения (Receive Task) очень похожи, за исключением следующих характеристик:
- Message Catch Event может запускать процесс и быть встроенным в него, а Receive Task - только быть встроенным;
- Receive Task может иметь прикрепленные события (таймеры, ошибки, эскалации и т.д.), а Message Catch Event - нет (зато сам может куда-нибудь прикрепляться);
- Message Catch Event может располагаться за Event Gateway, а Receive Task - нет (из-за особенностей Camunda).
Еще больше интересной и полезной информации вы сможете узнать на наших тренингах по Camunda.