Обработка статуса объекта WF4, пакетная обработка объектов

Я создал простой менеджер заказов WF службы (конечный автомат) в WF4.

простой рабочий процесс конечного автомата

Свойства заказа (сущности EF): Id, IsExport, NumOfProduct, ProductName, Status (ожидание, одобрено, отклонено).

Государственный автомат утверждает:
1. OrderReceived (проверка -> ответная деятельность)
2. Ожидание (пусто) - переходы:
обновление (операция обновления заказа) -> ожидание состояния утверждения (назначение поля статуса, операции обновления заказа и ответа) -> конечное состояние
3. Конечное состояние.

Ключ корреляции: Order.Id

Реализация подняла несколько вопросов.

  1. WF может управлять одним потоком экземпляра заказа, потоком заказа, и объект заказа находится в отношении один-один. Вопрос в том, где и как я должен реализовать листинг сущностей в соответствии с фильтром состояния (например, утвержденные заказы или ожидающие заказы). Список должен быть доступен через сервисный метод WCF.

  2. Какова лучшая практика для управления пакетной обработкой данных. (Например: Утверждение нескольких заказов. "Foreach" в клиенте не требуется.)

  3. Состояние заказа символизируется "экземплярами состояния активности" и полем статуса сущности в БД. Какова наилучшая практика для определения состояния сущности, перечисления активных постоянных экземпляров активности в определенном состоянии или выбора сущностей из БД (по активности) в соответствии с параметром фильтра состояния?

Любая помощь будет оценена.

2 ответа

Решение

Хорошие вопросы!

Принимая ваш первый и третий вопросы, есть несколько возможных подходов к этому. Все требуют, чтобы вы написали собственный сервис WCF для перечисления необходимых заказов. Это, вероятно, не будет WF-сервисом; это может быть служба REST или OData. Как бы вы внедрили услугу?

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

  2. Вы можете положиться на механизм отслеживания, предоставленный WF, и на расширения, на которые ссылается Рон Джейкобс в своем ответе на ваш вопрос. Инфраструктура отслеживания описана здесь на MSDN. Можно использовать объект отслеживания в памяти, чтобы получить состояние активных рабочих процессов. Тем не менее, это, вероятно, не будет работать хорошо со службами IIS/WF, которые автоматически сохраняются и выгружаются, когда неактивны. Было бы лучше использовать средства отслеживания для записи записей о состоянии в базу данных. Ваш пользовательский сервис просто запросит эту базу данных отслеживания.

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

Что касается вашего второго вопроса, это немного сложнее. Допустим, вы пишете REST-сервис, в котором перечислены заказы, ожидающие утверждения. Вы создаете веб-страницу, на которой отображаются эти заказы, и пользователь может проверить заказы, которые он хочет утвердить. Теперь количество рабочих процессов, которое вам нужно обновить, равно количеству утвержденных им заказов.

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

Какая альтернатива? Вам нужно написать собственный метод сервиса для вашего сервиса, не относящегося к WF, который принимает массив идентификаторов заказа. Эта служба должна будет вызывать вашу службу WF несколько раз, чтобы обновить каждую из них. Поскольку служба WF вызывается из другой службы на том же компьютере, вы можете использовать привязку.Net Named Pipe вместо одной из привязок HTTP, так что издержки будут намного меньше.

Стоит отметить, что Entity Framework также не поддерживает пакетные обновления. Вам нужно написать хранимую процедуру или пользовательский SQL, если вы хотите, чтобы обновление базы данных также было пакетным.

Стоит ли все это усилий? Наверное! Использование WCF и связывание именованных каналов довольно стандартно для WF. Вам нужно будет настроить службу активации Windows для именованных каналов. Кроме того, если вы еще не используете AppFabric для Windows Server, изучите его, поскольку он добавляет несколько очень хороших инструментов управления для сервисов WF.

Недавно я опубликовал несколько новых примеров, чтобы показать, как вы можете получить доступ к текущему состоянию StateMachine и возможным переходам. Это может помочь вам.

Windows Workflow Foundation (WF4) - служба рабочего процесса отслеживания конечного автомата Windows Workflow Foundation (WF4) - отслеживание конечного автомата

Другие вопросы по тегам