Expero.Libraries.CSharp.BackgroundTasks 1.0.0

Expero.Libraries.CSharp.BackgroundTasks

Пакет для упрощения работы с фоновыми задачами.

Пакет содержит:

  • Реализации интерфейса IBackgroundTaskPlanner, содержащий логику планирования задачи для выполнения в фоне;

  • Интерфейсы IBackgroundTaskExecutor и IBackgroundTaskHandler, позволяющие определить обработку для запланированных задач;

  • Реализацию интерфейса IBackgroundTaskDataRepository, содержащий логику работы с дополнительными данными по задаче.

Подключение к проекту.

Пакет явлеяется аггрегацией ниже приведённых пакетов и требует наличия настройки в соответствии с их требованиями:

  • Expero.Libraries.CSharp.Logging

  • Expero.Libraries.CSharp.RabbitMQ

  • Mds.Libraries.CSharp.Db.Mongo

  • Mds.Libraries.CSharp.Db.Redis

Для подключения процесса обработки фоновой задачи в пакете есть 2 метода:

AddBackgroundProcess<TTask>(Action<BackgroundTaskSettings<TTask>> buildAction).

AddBackgroundProcess<TTask, TData>(Action<BackgroundTaskSettings<TTask>> buildAction).

Модель задачи TTask должна наследоваться от BackgroundTask, а данные для неё TData от BackgroundTaskData. Использование TData необязательно. Система подразумевает работу только через TTask.

На одну модель задачи TTask возможно подключение только одного процесса обработки.

После регистрации фонового процесса для задачи через DI будут доступны следующие сервисы:

  • IBackgroundTaskPlanner - сервис планирования задач.

  • IBackgroundTaskDataRepository - репозиторий для работы с данными к задаче.

Для корректной обработки задач необходимо реализовать IBackgroundTaskExecutor или же подключить дефолтный. Дефолтный исполнитель использует все зарегистрированные инстансы IBackgroundTaskHandler.

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

Важно, обратите внимание, что IBackgroundTaskExecutor является дженериком только от TTask. Это сделано для того, чтобы вы в своей релизации могли сами выбирать механику работы с TData.

Данные сервисы будут являтся дженериками от задачи (<TTask>) или задачи и данных (<TTask, TData>) в соответствии с подключением.

BackgroundTaskSettings

Модель содержит набор настроек для работы с задачами:

  • ExchangeName - название обменника (RabbitExchangeName) в RabbitMQ для планирования задач;

  • QueueName - название очереди (RabbitQueueName) в RabbitMQ для планирования задач;

  • IsExecutionEnabled - флаг(bool) указывающий на необходимость выполнения задач;

  • ConsumersQuantity - количество(int) параллельных потоков;

  • MaxAttemptsBeforeFail - количество(int) повторных попыток выполнить задачу;

  • LockLifetime - время (TimeSpan) блокировки задачи во время выполнения;

Пример регистрации обработки задачи

public void AddService(IServiceCollection services)
{
    services.AddBackgroundProcess<BackgroundTask>(s =>
            {
                s.ExchangeName = new ("exchange");
                s.QueueName = new ("queue");
                s.ConsumersQuantity = 1;
                s.IsExecutionEnabled = true;
                s.MaxAttemptsBeforeFail = 1; // можно не задавать, по дефолту 1
                s.LockLifetime = TimeSpan.FromSeconds(15); // можно не задавать, по дефолту 15 сек
            })
            .AddDefaultExecutor() // можно подключать кастомный исполнитель
            .AddHandler<BackgroungTaskHandler>(); // обработчики можно регистрировать отдельно по интерфейсу IBackgroundTaskHandler
}

IBackgroundTaskPlanner

Сервис IBackgroundTaskPlanner используется для планирования задачи необходимого типа в очередь указанную при подключении.

Пример использования

internal class YourService
{
    private readonly IBackgroundTaskPlanner<YourTask> _planner;

    public YourService(IBackgroundTaskPlanner<YourTask> planner)
    {
        _planner = planner;
    }

    /*...*/

    private async Task<YourTask> PlanAsync()
    {
        var @new = new YourTask();

        return await _planner.Publish(@new);
    }
}

IBackgroundTaskExecutor

Интерфейс IBackgroundTaskExecutor используется для выполнения задачи.

В пакете уже есть дефолтные реализации для задачи без дополнительных данных и с ними. Дефолтные исполнители перебирают все зарегистрированные в DI обработчики для задачи (IBackgroundTaskHandler).

Без наличия зарегистрированной в DI реализации интерфейса IBackgroundTaskExecutor задачи не будут выполняться.

В результате обработки задачи исполнитель должен вернуть результат обработки задачи.

Есть три варианта:

  • RabbitMessageProcessingResult.Processed - сообщение успешно обработано.
  • RabbitMessageProcessingResult.NeedReQueue - сообщение нельзя обработать сейчас, нужно попробовать позднее.
  • RabbitMessageProcessingResult.CantBeProcessed - сообщение нельзя обработать вообще.

Пример использования собственного

internal class YourExecutor: IBackgroundTaskExecutor<YourTask>
{
    private readonly IEnumerable<IBackgroundTaskHandler<YourTask>> _handlers;

    public YourExecutor(IEnumerable<IBackgroundTaskHandler<YourTask>> handlers)
    {
        _handlers = handlers;
    }


    async Task<RabbitMessageProcessingResult> IBackgroundTaskExecutor<YourTask>.ExecuteAsync(YourTask task)
    {
        return await ProcessTaskAsync(task, _handlers);
    }

     /*...*/
}

IBackgroundTaskHandler

Интерфейс IBackgroundTaskHandler используется для обработки задачи.

Регистрация в DI реализаций обработчиков обязательна в случае использования дефолтного IBackgroundTaskExecutor. Обработчики необходимо регистрировать дженериками от задачи и данных аналогично подключению процесса обработки задачи.

При использовании кастомного IBackgroundTaskExecutor возможно использование отличного интерфейса обработчика.

Пример использования без данных

internal class YourHandler: IBackgroundTaskHandler<YourTask>
{
    /*...*/

    async Task<RabbitMessageProcessingResult> IBackgroundTaskHandler<YourTask>.ExecuteAsync(YourTask task)
    {
        return await ProcessTaskAsync(task);
    }

     /*...*/
}

Пример использования с дополнительными данными

internal class YourHandler: IBackgroundTaskHandler<YourTask, YourTaskData>
{
    /*...*/

    async Task<RabbitMessageProcessingResult> IBackgroundTaskHandler<YourTask>.ExecuteAsync(YourTask task, YourTaskData data)
    {
        return await ProcessTaskAsync(task, data);
    }

     /*...*/
}

Репозитории

При планировании задачи данные сохраняются в коллекции MongoDB.

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

No packages depend on Expero.Libraries.CSharp.BackgroundTasks.

Version Downloads Last updated
4.0.0 1 02/28/2026
3.1.0 1 02/28/2026
3.0.0 1 02/28/2026
3.0.0-beta.146970 1 02/28/2026
2.4.3 1 02/28/2026
2.4.1 1 02/28/2026
2.4.1-beta.115992 1 02/28/2026
2.4.0 1 02/28/2026
2.4.0-beta.108300 1 02/28/2026
2.3.0 1 02/28/2026
2.3.0-beta.108065 1 02/28/2026
2.2.0 1 02/28/2026
2.2.0-beta.105359 1 02/28/2026
2.2.0-beta.105249 1 02/28/2026
2.2.0-beta.105248 1 02/28/2026
2.1.0 1 02/28/2026
2.1.0-beta.103434 1 02/28/2026
2.0.1 1 02/28/2026
2.0.0 1 02/28/2026
2.0.0-beta.88735 1 02/28/2026
1.11.0 1 02/28/2026
1.10.0 1 02/28/2026
1.10.0-beta.88734 1 02/28/2026
1.9.1-beta.93210 1 02/28/2026
1.9.0 1 02/28/2026
1.8.0 1 02/28/2026
1.7.2 1 02/28/2026
1.7.1 1 02/28/2026
1.6.0 1 02/28/2026
1.6.0-beta.80579 1 02/28/2026
1.5.0 1 02/28/2026
1.4.0 1 02/28/2026
1.4.0-beta.69171 1 02/28/2026
1.3.0 1 02/28/2026
1.2.0 1 02/28/2026
1.1.0 1 02/28/2026
1.0.0 1 02/28/2026