Помощь с настраиваемым рабочим процессом, который отслеживает состояние объектов - PullRequest
3 голосов
/ 29 марта 2010

Мне нужно написать рабочий процесс, который контролирует состояние объекта. (Может потребоваться несколько дней или часов, чтобы изменить состояние)

У меня есть следующие состояния для объекта (давайте назовем его объектом Issue):

1) Created
2) Unowned
3) Owned
4) UnAssigned
5) Assigned
6) In Progress
7) Signed Off
8) Closed

Мне также нужно было бы предпринять какое-то действие с объектом, если бы объект находился в определенном состоянии в течение определенного периода (не совсем уверен, как это можно сделать).

Владелец / правопреемник объекта может измениться в любой момент (то есть перейти от In Progress к UnOwned), поэтому я предполагаю, что диаграмму конечного автомата я должен использовать. Если мое мышление неверно, пожалуйста, дайте мне знать.

Мое приложение написано на c # .net 3.5.

Я думал о том, чтобы иметь сервисный метод с именем CreateIssue, который вставил бы билет в базу данных, а затем начал бы экземпляр рабочего процесса (с объектом или id объекта в качестве параметров). Я не был уверен, как рабочий процесс узнает, когда конкретный объект был обновлен, или изменилось ли состояние объекта. Я сделал несколько очень простых приложений типа «привет мир» с Windows Workflow Foundation 3.5, но еще не понял, как сделать что-то подобное.

Любое направление по этому вопросу будет чрезвычайно полезным.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 08 апреля 2010

Нет прямого механизма в WF, чтобы автоматически обнаруживал, когда объект изменился - это оставляет вам три варианта:

  1. Приостановите рабочий процесс и используйте внешний код для его возобновления при изменении состояния внешнего объекта.
  2. Внутри рабочего процесса добавьте действие Delay в структуру While, которая периодически проверяет объект на предмет изменений.
  3. Публикация события на объекте, которое срабатывает при изменении состояния объекта.

Опции 1 и 2 основаны на механизме опроса - в одном случае он реализован вне рабочего процесса, а в других - в нем. Вариант 3 использует шаблон Subject / Observer с событиями для уведомления рабочего процесса, когда происходит изменение.

Вариант 3 относительно легко реализовать с помощью WF EventDrivenActivity - , см. Документацию MSDN здесь или небольшую вики-статью об этом здесь . Эта опция также желательна с точки зрения того, что, если на объекте есть последовательность переходов состояний, рабочий процесс уведомляется о каждом из них - тогда как модель опроса может выбирать только последнюю (или ту, которая произошла, когда опрос проводился) .

Опции 1 и 2 имеют смысл, если у вас нет доступа к коду объекта, который вы отслеживаете, и / или вы не можете изменить поведение объекта. В этих случаях опрос в значительной степени ваш единственный выбор.

Чтобы выбрать между 1 и 2, вам нужно определить, сколько одновременных рабочих процессов у вас будет, и все они могут ожидать изменения состояния. WF хорошо масштабируется, когда рабочие процессы могут быть приостановлены и записаны в постоянное хранилище - он масштабируется хуже, когда многие сотни (или тысячи) активных рабочих процессов должны быть одновременно активными в памяти. Если вы когда-нибудь ожидаете, что несколько долго выполняющихся рабочих процессов ожидают таких отслеживаемых изменений, вы можете продолжить и реализовать вариант 2 (использовать действие задержки рабочего процесса). Если вы ожидаете много таких рабочих процессов, вам лучше выполнять мониторинг в отдельном потоке и приостанавливать рабочие процессы до тех пор, пока им не будет чем заняться.

Если вы выберете вариант 2, убедитесь, что вы разработали альтернативный путь для рабочего процесса (время ожидания, уведомление, состояние и т. Д.), Чтобы не оставлять активные потерянные рабочие процессы, которые никогда не прекратятся, но будут продолжать потреблять ресурсы. .

1 голос
/ 30 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...