Документация по разработке bpm’online
PDF
Документация по разработке
Описание платформы

Фоновое выполнение операции

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 секунд.


© Terrasoft 2002-2019.

Был ли данный материал полезен?

Как можно улучшить эту статью?