Подписка на события шлюза

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

Механизм формирование подписок и сообщений

Шлюз, чей серверный компонент реализует специальный интерфейс IGateMessageSource (сборка DocsVision.Workflow.Interfaces.dll), предоставляет канал для формирования подписок. Доступ к нему может быть получен через публичное свойство шлюза — SubscriptionChannel (тип ISubscriptionChannel), к примеру так:

DVGate dvGate = (DVGate)process.Gates[DVGate.GateID]; (1)

SubscriptionChannel subscriptionChannel = dvGate.SubscriptionChannel; (2)
1 Получение шлюза к Docsvision.
2 Получение канала подписок.

После получения канала подписок, разработчик может выполнить подписку на определённое событие, например, подписаться на событие разблокировки определённой карточки Docsvision:

subscriptionChannel.Subscribe((int)DocsVisionSubscriptionType.ObjectUnlock, process.ID, passInfo.FunctionID, cardId); (1)
1 cardId — идентификатор карточки, у которой ожидается разблокировка.

Метод Subscribe принимает (по порядку передачи параметров):

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

  2. Идентификатор процесса (бизнес-процесса), который подписывается на события. Этот процесс должен получить сообщение о наступлении события шлюза.

  3. Идентификатор функции, которая выполняет подписку на событие.

Также может быть передан (как в примере) дополнительный параметр (с типом Guid или String), тип и значение которого зависит от типа ожидаемого события шлюза (см. далее).

Если функция выполняет подписку на событие, то об этом необходимо проинформировать Workflow, вернув значение ExecResultEnum.WaitForMessage.

После подписки на событие, функция переходит в режиме ожидания и активируется при появлении сообщения соответствующего типа.

В общем случае, сценарий подписки и оповещения выглядит следующим образом:
  1. Менеджер процессов (часть ExecLogic) вызывает метод Execute текущей функции (к примеру, Функции N), которая должна быть запущена.

  2. Функции N, если это необходимо, оформляет подписку на событие в определённом шлюзе (к примеру, Шлюз T), посредством вызова метода Subscribe, и возвращает значение ExecResultEnum.WaitForMessage.

  3. Шлюз T, проверяет наличие подписок в своем хранилище (например, в базе данных) и организует проверку наступления соответствующего события.

  4. При наступлении события Шлюз T добавляет сообщение для Функции N, через вызов метода SendMessage. Сообщение добавляется в очередь сообщений конкретного процесса.

  5. Менеджер процессов проверяет очередь сообщений и, в случае наличия сообщения для Функции N, вызывает метод Execute Функции N.

Схематично данный сценарий можно представить следующим образом:

Сценарий подписки на событие шлюза и формирования сообщения о его наступлении
Рисунок 1. Сценарий подписки на событие шлюза и формирования сообщения о его наступлении

События шлюза к Docsvision

Шлюз к Docsvision разрешает подписку на следующие события (см. описание DocsVisionSubscriptionType):

  • CardChange — изменение заданной карточки. При вызове Subscribe необходимо передать (четвертый параметр) идентификатор отслеживаемой карточки.

  • AnyCardChange — изменение любой карточки заданного типа. При вызове Subscribe необходимо передать (четвертый параметр) идентификатор типа отслеживаемых карточек.

  • ObjectUnlock — разблокировка заданной карточки. При вызове Subscribe необходимо передать (четвертый параметр) идентификатор соответствующей карточки.

  • ObjectLock — блокировка заданной карточки. При вызове Subscribe необходимо передать (четвертый параметр) идентификатор соответствующей карточки.

События шлюза к файловой системе

Шлюз к файловой системе обеспечивает возможность подписки на события (см. описание FSSubscriptionType):

  • NewFileInFolder — добавление файла в указанную папку. При вызове Subscribe необходимо передать (четвертый параметр) сериализованный (XML-сериализация) объект типа FSSubscriptionInfo — параметры подписки.

  • FileChange — изменение указанного файла. При вызове Subscribe необходимо передать (четвертый параметр) сериализованный объект типа FSSubscriptionInfo.

События шлюза к почтовой системе

Шлюз к почтовой системе обеспечивает возможность подписки на события (см. описание MailSubscriptionType):

  • NewMessage — поступление нового сообщения. При вызове Subscribe необходимо передать (четвертый параметр) сериализованный объект типа MailFilter — фильтр для новых сообщений.

  • MessageWithSubstringInSubject — поступление нового сообщения с заданным тестом в заголовке письма. При вызове Subscribe необходимо передать (четвертый параметр) текст, который должен содержаться в заголовке ожидаемого письма.

Подписка на события шлюзов функциями приложения Workflow

Некоторые функции приложения Workflow используют подписку в своей работе. Ниже приведён полный список функций приложения Workflow, а также события, на которые они могут быть подписаны. Конкретный тип события, на которое подписывается функция, может зависеть от её конкретных настроек.

Функция События, на которые возможна подписка

Базовые функции:

Начальная функция

Не подписывается.

Конечная функция

Не подписывается.

Объединение И

Не подписывается, но может ожидать завершения другой функции.

Объединение Или

Не подписывается.

Разветвление

Не подписывается.

Подпроцесс

Не подписывается, но ожидает завершения другого подпроцесса.

Условие

Не подписывается.

Счетчик

Не подписывается.

Обработка коллекции

Не подписывается.

Удаление объекта

Не подписывается, но ожидает завершения удаления объекта.

Сценарий

Может подписываться на любые события шлюзов, если это реализовано разработчиком.

Обмен данными между переменными

Не подписывается.

Расписание

Подписывается на событие от таймера (Шлюз к простым типам).

Универсальный обмен данными

Не подписывается, но ожидает завершения обмена.

Универсальная функция

Может подписываться на любые события шлюзов, если это реализовано разработчиком выбранной функции.

Обработчик ошибок

Не подписывается.

Функции шлюза к Docsvision:

Мониторинг Docsvision

Может подписываться на изменение определённой карточки, либо карточек определённого типа.

Задание

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

Управление заданием

Не подписывается, но остается активным, если карточка заблокирована.

Ярлык

Не подписывается.

Функция рассылки согласований

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

Функция рассылки заданий

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

Задание 5

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

Параллельное задание

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

Последовательное задание

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

Функции шлюза к файловой системе:

Мониторинг файловой системы

Может подписываться на появление нового файла и изменение файла.

Функции шлюза к почтовой системе:

Мониторинг сообщений

Может подписываться на появление нового сообщения (и сообщения с определённой темой).

Сообщения задания 5

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