Windows Workflow Foundation WF4 - хостинг рабочих процессов - PullRequest
6 голосов
/ 11 марта 2011

Для клиента система, которую мы создаем, должна поддерживать следующее:
- Должно быть возможным запускать несколько рабочих процессов и несколько экземпляров одних и тех же рабочих процессов с различным контекстом (разные данные / бизнес-объекты).
- некоторые рабочие процессы будут длительными, будут включать в себя несколько сеансов пользователей / клиентов и будут ждать ввода внешнего пользователя.Таким образом, рабочие процессы должны быть в состоянии сохраняться и отвечать на некоторый сигнал из клиентского приложения.И это также означает, что выполнение рабочих процессов должно выполняться в серверном приложении (верно?).
- я хочу иметь возможность запускать все виды рабочих процессов в серверном приложении, и я не хочу повторять-развернуть приложение сервера при изменении рабочего процесса.

Моей первой мыслью были Workflow Services.После долгих исследований я пришел к выводу, что это неправильный путь, поскольку Workflow Services в основном дает возможность выполнять действия в удаленном месте из рабочего процесса, запущенного в клиентском приложении.Это правильно?Или я могу использовать Workflow Services для сценария выше?Большинство примеров и / или учебных пособий в основном представляют собой комбинацию ReceiveSignal / Send с некоторой логикой между ними.

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

Каков наилучший подход?

Любая помощь очень ценится!

1 Ответ

15 голосов
/ 11 марта 2011

Что касается ваших требований:

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

Это не проблема с WF.

Некоторые рабочие процессы будут продолжительными, привлекать несколько пользователей / клиентский сеанс и ожидание внешнего пользовательского ввода. Таким образом, рабочие процессы должны быть в состоянии сохраняются и отвечают на какой-то сигнал из клиентского приложения. И это также означает что выполнение рабочих процессов должно быть сделано на серверном приложении (верно?).

WF предназначен для длительных задач, которые могут взаимодействовать с внешними воздействиями. Однако это не говорит о том, что это легко сделать; нет универсального решения, к которому вы можете подключиться. Вам, вероятно, придется разрабатывать пользовательские действия, которые взаимодействуют с Workflow Extensions , которые обрабатывают перемещение пользовательского ввода в рабочий процесс. То же самое с раскрытием рабочего процесса, хотя WF4 поставляется с множеством действий WCF, которые можно использовать для достижения этой цели.

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

Это сложнее сделать. Вы должны, как минимум, отделить рабочие процессы от кода сервера. Самый простой способ - сохранить рабочий процесс как xaml и загрузить его во время выполнения , скажем, из базы данных.

Другими вариантами является использование какой-либо структуры внедрения зависимостей (такой как Structure Map или Unity), которая загружает сборку рабочего процесса во время выполнения. Если рабочие процессы меняются, вы можете удалить новую сборку на сервере, изменить конфигурацию и перезапустить. Кроме того, вы можете изолировать сборки вашего рабочего процесса в их собственном домене приложений, загружать их во время выполнения и выбрасывать домен, когда вам необходимо перезагрузить новую версию. Какой вы делаете, зависит от ваших требований; На самом деле я делаю третий вариант, так как мне нужно загружать много разных версий сборок рабочих процессов во время выполнения, запускать их одновременно, и они часто имеют встроенные ресурсы, что не позволяет мне идти по маршруту XAML.

Моя первая мысль была Workflow Сервисы. После долгих исследований я пришел к выводу, что это не правильно путь, поскольку Workflow Services в основном дает возможность выполнить деятельность в удаленном месте от рабочий процесс запущен в клиентском приложении. Является это правильно?

Я размещаю свои рабочие процессы в стандартном приложении-службе Windows. Я должен управлять и поддерживать интерфейс WCF, который клиент использует для взаимодействия с моими рабочими процессами. Насколько я могу судить, Workflow Services кажется жизнеспособным вариантом для стабильных рабочих процессов, если я правильно понимаю. Размещение приложения в AppFabric также является хорошим вариантом, и я считаю, что это проще, чем использование службы Windows. Но независимо от того, какой у вас хост, у вас есть два варианта: ваши рабочие процессы определяют ваш контракт на обслуживание, или вы должны определить контракт на обслуживание и обрабатывать все выполнение и взаимодействие с рабочими процессами, которыми вы управляете.

Первый - хороший вариант для стабильных рабочих процессов с простым фасадом. Это не кажется вам хорошим вариантом, поскольку вы должны динамически загружать рабочие процессы по мере их изменения; для этого требуется логика вне рабочего процесса для обработки не только сообщений от клиента («вот новая версия рабочего процесса X!»), но и управления сроком службы.

Похоже, вам нужно будет найти какое-то хост-приложение (приложение IIS WebService, служба Windows, AppFabric, Azure), определить службу WCF и подключить ее к сети, обрабатывать вызовы от клиентов, передавать эти вызовы в рабочий процесс. код, который затем должен загрузить и выполнить эти вызовы и вернуть результат по цепочке.

Я не могу не заметить, что вы, кажется, немного плохо подготовлены к путешествию, которое ожидает вас.Я настоятельно рекомендовал бы создать прототип, который аккуратно рассекает по центру мясо ваших требований.Размещенное приложение (я бы предложил AppFabric) с интерфейсом WCF, который загружает рабочий процесс на основе XAML, который обрабатывает клиентские вызовы.После того, как у вас есть простая версия, вы можете расширить сферу, чтобы охватить все ваши требования.

...