Как прекратить проходить через события, когда наступает финальное событие?
Я очень новичок в мире BPMN 2.0 (Камунда). Мне нужно смоделировать довольно сложный рабочий процесс, описанный ниже. Любая помощь высоко ценится!
У одного процесса есть "цикл обработки событий", который захватывает событие задачи из внешней системы, затем он асинхронно передает задачу для выполнения внешней системе и ожидает своего состояния завершения через механизм обратного вызова POST rest. Любое число таких событий задач может поступать до тех пор, пока не будет получено конкретное сообщение, которое отмечает конец списка задач. На этом этапе основной процесс должен проверить, все ли асинхронно отправленные задачи завершены, или дождаться завершения еще выполняющихся задач. Если какая-либо из задач завершилась неудачно, весь процесс должен быть помечен как неудачный.
2 ответа
Этот сценарий очень похож на тот, который мы реализовали у нашего клиента.
Однако вам нужно будет подумать о проблеме по-другому. Ни Camunda, ни его предшественник (Activiti) не способны обрабатывать то, что мне нравится называть "долговременными" сообщениями. "Долгосрочное" сообщение - это сообщение, которое сохраняется в двигателе до тех пор, пока двигатель не придет и не начнет его искать. Как правило, если вы используете платформу сообщений pub/sob, такую как JMS, это не проблема. Но если вы общаетесь через http через tcp, то это может быть хлопотно, так как СООБЩЕНИЯ МОГУТ БЫТЬ ПОТЕРЯННЫМИ.
Итак, я предполагаю (основываясь на вашем описании), что вы планируете использовать http через tcp.
Итак, чтобы убедиться, что вы не потеряете сообщения, вам необходимо отказаться от парадигмы "петли". С помощью цикла вы не можете гарантировать, что экземпляр процесса будет ожидать выполнения задачи при получении сообщения.
Таким образом, вместо того, чтобы использовать цикл, вы должны рассмотреть один процесс "экземпляра", который запускается событием запуска сообщения, событие запуска сообщения будет включать ключ бизнес-данных, который действует как корреляция между связанными экземплярами.
Основной поток ниже:
Обратите внимание, что поток очень прост, получите сообщение, сделайте асинхронный вызов и дождитесь сообщения об успешном завершении, затем завершите.
Существует шлюз принятия решений, который определяет, является ли входящее сообщение концом списка задач. Если это обнаружено, мы выполняем ветвление, запрашиваем активные экземпляры с одним и тем же ключом корреляции и ожидаем, что экземпляры либо сработают, либо завершатся. По завершении завершающий экземпляр процесса задачи завершается и обновляет соответствующий контрольный журнал.
Если по завершении экземпляров ЛЮБОЙ сбой, то экземпляр "конечной задачи" обрабатывает состояние ошибки.
Вы можете использовать задачу получения действий для достижения этой цели.
http://www.activiti.org/userguide/
У меня была похожая ситуация, когда в моем рабочем процессе нам приходилось ждать входных данных от внешнего приложения. Вы можете использовать задачу ожидания, а затем, когда вы получите эти данные, вы должны явно указать эту задачу, чтобы выполнение перешло к следующему этапу.