2016-10-12 3 views
0

Я очень новичок в мире BPMN 2.0 (Camunda). Мне нужно смоделировать довольно сложный рабочий процесс, описанный ниже. Любая помощь высоко ценится!Как остановить цикл событий, когда наступает последнее событие?

У одного процесса есть «цикл событий», который захватывает событие задачи из внешней системы, затем он представляет задачу асинхронно для выполнения во внешнюю систему и ожидает своего статуса завершения, хотя механизм обратного вызова останова POST. Любое количество событий таких задач может появиться до тех пор, пока не будет получено определенное сообщение, которое будет знаменует конец списка задач. На этом этапе основной процесс должен проверить, завершены ли все асинхронно поданные задачи или ждут завершения выполняемых задач. Если какая-либо из задач завершилась неудачей, весь процесс должен быть отмечен как сбой.

ответ

0

Этот сценарий очень похож на тот, который мы реализовали у нашего клиента.

Однако вам нужно будет подумать о проблеме по-другому. Ни Camunda, ни ее предшественник (Activiti) не могут обрабатывать то, что мне нравится, называть «прочными» сообщениями. «Долговечное» сообщение - это то, которое будет сохраняться в двигателе до тех пор, пока двигатель не появится и не ищет его. Как правило, если вы используете платформу сообщений pub/sob, такую ​​как JMS, это не проблема. Но если вы общаетесь через http через tcp, это может быть проблематичным, так как СООБЩЕНИЯ могут быть MISSED/LOST.

Итак, я предполагаю (на основе вашего описания), что вы планируете использовать http через tcp.

Итак, чтобы вы не потеряли сообщения, вам нужно отказаться от парадигмы «петли». С циклом вы не можете гарантировать, что экземпляр процесса будет ждать при получении задачи, когда приходит сообщение.

Таким образом, вместо использования цикла вы должны рассмотреть один «экземпляр», который запускается событие начала сообщения, событие начала сообщения будет включать в себя ключ бизнес-данных, который действует как корреляция между связанными экземплярами.

Основной поток ниже:

enter image description here

Обратите внимание, что поток очень просто, получить сообщение, сделать вызов асинхронной и ждать сообщения об успешном завершении, то конец.

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

Если по завершении экземпляров ANY сбой, то экземпляр «final task» обрабатывает условие ошибки.

+0

Спасибо, Грег! Это очень хорошая отправная точка для меня. –

+0

Не беспокойтесь Пелых, если бы вы могли установить анср, как принято, и повышать, я бы очень признателен. –

0

Для достижения этой цели вы можете использовать задачу получения activiti.

http://www.activiti.org/userguide/#bpmnReceiveTask

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