Решение
Фундаментальное мероприятие, которое решает эту проблему: WhileActivity
, содержащее ListenActivity
.
Акту прослушивания дается 3 EventDrivenActivity
веток. Первая - это ваша ветвь «Задача пользователя выполнена», вторая - ветка «Менеджер изменил назначенного пользователя», а третья содержит DelayActivity
, за которой следует логика вашей электронной почты.
В операции прослушивания любая из ветвей может завершить операцию прослушивания, и когда они выполнят другие действия в операции прослушивания, будут отменены.
Вам необходимо убедиться, что последовательность «Задача пользователя завершена» задает некоторое значение, которое может быть проверено циклом while, так что цикл while завершается, когда пользователь завершает задачу.
Когда ветвь, отличная от ветки «User Task Completed», отвечает за завершение рабочего процесса ListenActivity
, возвратится к ListenActivity
и повторно выполнит все 3 события, управляемые событиями, включая ту, которая содержит DelayActivity
.
Обратите внимание, что это немного отличается от подхода EventHandlingScope, потому что "прослушивание пользовательской задачи завершено" будет отменено и повторно выполнено, тогда как с EventHandlingScope это не произойдет. IMO - это лучшая договоренность, поскольку это означает, что пользователь, который был выбран для выполнения задачи в начале действия Listen, в конце гарантированно не изменится (потому что, если он будет изменен, вся операция будет отброшена, а новая запущена ).
Почему задержка срабатывает только один раз в EventHandlingScope
По сути, вы настроили область, которая слушает два события. Одним из них было то, что ваши менеджеры изменили назначенное пользовательское событие, другим было «событие, вызванное таймером».
Теперь способ, описанный в документации, звучит так, как будто задействован какой-то цикл, как будто после завершения одного из этих действий они перезапускаются. Однако это не совсем так, на самом деле он просто продолжает прослушивать исходное событие и будет перезапускать содержимое, если сработает другое такое событие.
В случае DelayActivity
существует некоторое внутреннее «событие, вызванное таймером», которое прослушивается. Когда Задержка впервые введена, тайм-аут настроен так, что таймер сработает в соответствующее время, затем он прослушивает это событие. Однако после срабатывания прицела возвращается к прослушиванию «события, инициированного таймером», однако не происходит повторного запуска исходного кода, который устанавливает тайм-аут, и, следовательно, никаких других «событий, запускаемых таймером», не ожидается.