Фоновое выполнение операции
Glossary Item Box
Общие сведения
При разработке в bpmonline часто необходимо выполнять операции, требующие достаточно длительного времени выполнения, и при этом не допускать задержек в работе пользовательского интерфейса. Начиная с версии 7.13.2 в bpm'online реализована функциональность фонового выполнения операций.
Для запуска фоновых операций в классе Terrasoft.Core.Tasks.Task реализованы два метода StartNew() и StartNewWithUserConnection(). Отличие метода StartNewWithUserConnection() состоит в возможности запустить фоновую задачу, которая требует пользовательское соединение UserConnection.
Аргументами этих методов быть как базовые типы .NET (например, string, int, Guid и т. п.), так и пользовательские типы.
ВАЖНО
Аргументы, принимаемые фоновой операцией, будут преобразованы в массив байт с помощью модуля MessagePack-CSharp. Поэтому могут быть сгенерированы исключения, если не удается успешно сериализовать или десериализовать значение аргумента.
Действие асинхронной операции описывается в отдельном классе, который должен реализовать интерфейс IBackgroundTask<in TParameters>. Если для выполнения действия требуется пользовательское соединение, то класс должен дополнительно реализовать интерфейс IUserConnectionRequired.
Интерфейс IBackgroundTask<in TParameters>:
namespace Terrasoft.Core.Tasks { public interface IBackgroundTask<in TParameters> { void Run(TParameters parameters); } }
Интерфейс IUserConnectionRequired:
namespace Terrasoft.Core { public interface IUserConnectionRequired { void SetUserConnection(UserConnection userConnection); } }
Пример
Описание примера
Создать бизнес-процесс, регистрирующий фоновую операцию. Процесс должен завершиться практически сразу же после запуска. Фоновая операция должна выполняться около 30 секунд, по истечении которых в разделе [Активности] можно будет найти запись с заголовком "Задача, созданная фоновой операцией" ("Activity created by background task").
Алгоритм реализации примера
1. Создать класс данных для объекта раздела [Активности]
В пользовательском пакете создайте схему типа [Исходный код] с названием "UsrActivityData" (см. "Создание схемы [Исходный код]"). Добавьте в нее следующий исходный код:
namespace Terrasoft.Configuration { using System; using Terrasoft.Common; using Terrasoft.Core; using Terrasoft.Core.DB; public class UsrActivityData { public string Title { get; set; } public Guid TypeId { get; set; } } }
Сохраните схему.
2. Создать класс для добавления активности
В пользовательском пакете создайте схему типа [Исходный код] с названием "UsrBackgroundActivityCreator" (см. "Создание схемы [Исходный код]"). Добавьте в нее следующий исходный код:
namespace Terrasoft.Configuration { using System; using Terrasoft.Common; using Terrasoft.Core; using Terrasoft.Core.DB; using Terrasoft.Core.Tasks; public class UsrBackgroundActivityCreator : IBackgroundTask<UsrActivityData>, IUserConnectionRequired { private UserConnection _userConnection; public void Run(UsrActivityData data) { // Принудительная задержка 30 секунд. System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(30)); // Создание активности. var activity = new Activity(_userConnection){ UseAdminRights = false, Id = Guid.NewGuid(), TypeId = data.TypeId, Title = data.Title, // Категория активности "Выполнить" ActivityCategoryId = new Guid("F51C4643-58E6-DF11-971B-001D60E938C6") }; activity.SetDefColumnValues(); activity.Save(false); } public void SetUserConnection(UserConnection userConnection) { _userConnection = userConnection; } } }
В методе Run() после принудительной задержки в 30 секунд создается экземпляр объекта раздела [Активности] на основе предоставленного экземпляра UsrActivityData.
Сохраните схему.
3. Создать бизнес-процесс для запуска фоновой задачи
1. Создайте новый бизнес-процесс.
2. Добавьте в него элемент [Задание-сценарий] (рис. 1).
Рис. 1. — Свойства элемента [Задание-сценарий]
3. В элемент [Задание-сценарий] добавьте следующий исходный код:
var data = new UsrActivityData { Title = "Activity created by background task", TypeId = ActivityConsts.TaskTypeUId }; Terrasoft.Core.Tasks.Task.StartNewWithUserConnection<UsrBackgroundActivityCreator, UsrActivityData>(data); return true;
4. Сохраните бизнес-процесс и запустите его на выполнение.
В результате выполнения примера бизнес-процесс завершится практически сразу же после запуска, а задача будет создана только через 30 секунд.