Рабочий процесс Windows - PersistableIdle - PullRequest
5 голосов
/ 26 ноября 2011

В нашей компании есть бизнес-процесс, который должен:

  1. Получить данные от X
  2. Дождаться, пока пользователь Y проведет исследование
  3. Получить данные отZ на основе данных шага 2

При исследовании этого кажется, что есть несколько вариантов для реализации этого в рабочем процессе.

  1. Добавьте действие задержки между шагом 1 (действие рабочего процесса) и Шаг 3 (действие рабочего процесса).Затем во время события PersistableIdle выгрузите рабочий поток.Когда пользователь выполнит шаг 2, перезагрузите рабочий процесс из базы данных.
  2. То же, что и # 1, за исключением использования закладки вместо операции задержки.

Есть ли лучший подход(1, 2 или другой вариант)?

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

1 Ответ

5 голосов
/ 30 ноября 2011

Есть ли лучший подход (1, 2 или другой вариант)?

На первый взгляд, # 2 звучит как необходимый.Причина использования закладок (или какой-либо деятельности по закладкам, например, получения) заключается в том, что их можно возобновить в любое время.Это позволяет завершить исследование пользователя Y и возобновить выполнение рабочего процесса в любое время (вместо того, чтобы блокировать его до истечения задержки).

Контраргумент, что # 1 также может быть необходим, заключается в том, что вы можете пожелатьустановить ограничение по времени, которое запускает действия рабочего процесса (срабатывание напоминаний, исключения, отмены и т. д.).

Как принять решение?Я думаю, что ответ обычно # 3: Оба

Использование Pick Activity - отличный способ сделать оба.Используя операцию «Закладка» в одном триггере PickBranch и операцию «Задержка» в другом триггере PickBranch, вы можете составить рабочий процесс, который будет «обрабатывать то, что произойдет первым - пользователь Y или время ожидания».

Вторичный вопрос, который вы задаете, - это «Как я могу остановить выгрузку рабочего процесса, если я не хочу, чтобы это был неожиданный рабочий процесс, выгрузивший риск? »

Ну, это зависит.Если вы используете WorkflowServiceHost, то выгрузка рабочего процесса не представляет большого риска, потому что WorfklowServiceHost достаточно умен, чтобы перезагрузить рабочий процесс, когда ему нужно выполнить больше работы (обработать входящее сообщение или возобновить с задержки).

Если вы не используете WorkflowServiceHost, вы, вероятно, пишете свой хост, вы можете добиться того же эффекта с некоторой работой, или вы можете просто предотвратить возникновение разгрузки - когда вы пишете хост, вы контролируете политику выгрузкичерез события в WorkflowApplication

Другие разные моменты: -Асинхронный код Деятельности действительно препятствуют сохранению вашего рабочего процесса, пока они выполняют асинхронную работу.Я не думаю, что они должны быть преднамеренно использованы в качестве механизма анти-персистентности - если вы хотите один из них, проверьте действие NoPersistZone .

- Нет действия «Выгрузить», но есть «персистская» активность.Рабочие процессы могут сказать, что хотят сохранить прогресс, но только хост принимает окончательное решение о том, когда происходит выгрузка.

...