Асинхронные обработчики
<< Click to Display Table of Contents >> Разработка > Элементы разработки > Модуль Асинхронные обработчики |
Асинхронные обработчики позволяют:
•вынести длительные, ресурсоемкие операции, не требующие немедленного возврата результата, с веб-сервера на отдельный сервис Worker;
•одновременно выполнить вычисления в несколько потоков (распараллеливание вычислений).
Благодаря этому можно ускорить исполнение тяжелых операций, снизить нагрузку на веб-сервер, а также ускорить отклик системы для конечного пользователя.
В Directum RX асинхронные обработчики используются для автоматической выдачи прав на документы сотрудникам по настроенным правилам. В этом случае права выдаются на большое количество документов, результат не требуется получить сразу же после выполнения (в основном потоке), а сам процесс является ресурсоемким и его можно распараллелить на несколько потоков. Поэтому вычисления удобно выполнить на отдельном сервисе Worker.
Схема работы
1.В нужном месте серверного кода прикладной разработчик создает асинхронный обработчик, заполняет параметры и вызывает его. При этом выполнение серверного кода продолжается.
2.Асинхронный обработчик отправляется на сервис Worker.
3.На Worker, то есть за рамками основного потока, асинхронный обработчик выполняет свои вычисления. Если во время выполнения асинхронного обработчика возникает ошибка, то он повторяется в соответствии с интервалом, заданным разработчиком при его создании.
Создание асинхронного обработчика
1.Откройте редактор модуля, в котором будет создан асинхронный обработчик. В узле «Асинхронные обработчики» нажмите на кнопку Добавить.
2.В списке элементов выберите добавленный асинхронный обработчик и задайте настройки:
*Имя асинхронного обработчика. Должно быть уникальным в рамках одного модуля, может состоять из букв латинского алфавита и цифр.
*Описание. Назначение асинхронного обработчика. Для локализации описания перейдите по ссылке Локализовать.
Идентификатор асинхронного обработчика. Присваивается автоматически при создании. Используется при настройке в секции сервиса асинхронных событий конфигурационного файла.
3.Задайте параметры, которые будут передаваться из места вызова асинхронного обработчика в код выполнения асинхронного обработчика.
Название параметра. Должно быть уникальным в рамках одного асинхронного обработчика, может состоять из букв латинского алфавита и цифр.
Тип данных параметра. Возможные значения: Строка, Целое, Идентификатор, Вещественное, Дата, Логическое.
Примечание. Типы параметров асинхронных обработчиков осознанно ограничены простыми типами. Например, нельзя использовать тип Бинарные данные, так как передача файлов через массив байт приведет к большому потреблению ресурсов на сервисе Worker. С файлами надо работать только через потоки.
4.В свойстве Повторить укажите, как будет происходить повторное выполнение асинхронного обработчика на сервисе Worker в случае возникновения ошибки. Например, при ошибках, связанных с блокировками. Возможные значения:
С увеличением интервала до 1 часа, чтобы попытаться выполнить обработчик с увеличивающимся по экспоненте интервалом между попытками (максимальный интервал – 1 час).
Через равные промежутки времени с обязательным указанием интервала повтора в минутах.
По умолчанию асинхронный обработчик прекращает выполнение после 100 попыток. При необходимости измените это значение в свойстве Максимальное количество повторов.
Параметр args.Retry позволяет программно управлять необходимостью повтора. Если лимит повторов превышен, то асинхронный обработчик не выполняется.
С помощью args.RetryIteration можно проверить, какая попытка повтора выполняется на данный момент.
5.Задайте обработчик события Выполнение для добавления логики асинхронного обработчика.
Пример. Автоматическая выдача прав на документы
public virtual void GrantAccessRightsToDocument(Sungero.Docflow.AsyncHandlers.GrantAccessRightsToDocumentInvokeArgs args)
{
long documentId = args.DocumentId;
long ruleId = args.RuleId;
Logger.DebugFormat("TryGrantRightsByRule: start grant rights for document {0}, rule {1}", documentId, ruleId);
var isGranted = Docflow.Functions.Module.GrantRightsToDocument(documentId, ruleId);
if (!isGranted)
{
Logger.DebugFormat("TryGrantRightsByRule: cannot grant rights for document {0}, rule {1}", documentId, ruleId);
args.Retry = true;
}
else
Logger.DebugFormat("TryGrantRightsByRule: success grant rights for document {0}, rule {1}", documentId, ruleId);
}
Кроме того, в асинхронных обработчиках доступна работа с транзакциями, которые позволяют объединить несколько операций в один логический блок. При использовании транзакций сделайте программную проверку их выполнения. Если транзакция завершится с ошибкой, асинхронный обработчик повторно выполняться не будет.
6.Вызовите асинхронный обработчик в нужном месте серверного кода. Асинхронные обработчики создаются по формату <Имя модуля>.AsyncHandlers.<Имя асинхронного обработчика>.Create().
Пример. Создание и вызов асинхронного обработчика (автоматическая выдача прав)
public override void AfterSave(Sungero.Domain.AfterSaveEventArgs e)
{
...
// Создать асинхронный обработчик GrantAccessRightsToDocument.
var asyncRightsHandler = Docflow.AsyncHandlers.GrantAccessRightsToDocument.Create();
// Заполнить параметры асинхронного обработчика.
asyncRightsHandler.DocumentId = _obj.Id;
// Вызвать асинхронный обработчик.
asyncRightsHandler.ExecuteAsync();
...
}
При вызове асинхронного обработчика можно указать уведомления, которые нужно показывать пользователям при запуске и завершении выполнения обработчика.
7.При необходимости выполните отладку кода асинхронного обработчика. Для этого на панели инструментов выберите Отладить общий сервис.
Параметры асинхронного обработчика
В событии асинхронного обработчика можно использовать параметры:
Имя |
Тип |
Описание |
---|---|---|
args.Retry |
bool |
Признак, который определяет нужно ли повторно выполнять асинхронный обработчик после возникновения ошибки |
args.RetryIteration |
int |
Счетчик повторов. С помощью параметра можно понять, какая попытка повтора сейчас выполняется |
args.NextRetryTime |
Nullable<DateTime> |
Дата и время следующего повтора обработчика |
Изменение асинхронного обработчика
Чтобы изменить асинхронный обработчик стандартного решения Directum RX, перекройте модуль, к которому он относится. В перекрытии модуля вы сможете изменить интервал повтора, а также обработчик события Выполнение.
© Компания Directum, 2024 |