Введение

Hangfire — распределенный и расширяемый планировщик задач для приложений на.NET.

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

Hangfire.Console

Hangfire.Console — библиотека, добавляющая консоль для ведения задач. Данная библиотека позволяет выводить логи и так же добавлять прогресс бар. К сожалению, данная библиотека не обновлялась с 2018 года, но это не мешает использовать её в качестве основы для других библиотек.

Hangfire.Console.Extensions

Данная библиотека предоставляет абстракции для работы с Hangfire.Console. Запуск задачи через IJobManager внутри другой задачи позволит связать их как Continuation. Вместо использования PerformContext для ведения логов можно писать их в привычный ILogger. Прогресс бар можно создать через IProgressBarFactory. IJobCancellationToken теперь можно зарегистрировать через конструктор, а не передавать в качестве параметра метода. PerformContext можно получить через IPerformingContextAccessor. Таким образом мы избавимся от необходимости передавать PerformContext и IJobCancellationToken в метод, что сделает код более чистым и читаемым.

Hangfire.Console.Extensions.Serilog

Hangfire.Console.Extensions.Serilog — небольшая библиотека, которая позволяет подружить Serilog с Hangfire. Теперь логи будут попадать в Hangfire.

"Serilog": {
  "Enrich": [
    "WithHangfireContext"
  ],
  "WriteTo": [
    {
      "Name": "Hangfire",
      "Args": {
        "restrictedToMinimumLevel": "Information"
      }
    }
  ]
}

Hangfire.PowerShellExecutor

Hangfire.PowerShellExecutor расширяет возможности Hangfire.Console, позволяя запускать PowerShell скрипты и выводить их в консоль.

public void WithoutInjection(PerformContext context, CancellationToken cancellationToken)
{
	var localProcess = new PSExecutorBuilder(context)
		.SetCommand("Get-ChildItem")
		.SetExecutionPolicy(PSExecutionPolicy.Bypass)
		.Build();
	localProcess.Start(cancellationToken);
}

Hangfire.Dashboard.Management.v2

Hangfire.Dashboard.Management.v2 — одна из многочисленных библиотек для Hangfire, которая позволяет управлять задачами через графический интерфейс. Функционал библиотеки позволяет гибко запланировать время выполнение задачи (моментально, через какой‑то промежуток времени или задать CRON expression).

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

Hangfire.MissionControl

Hangfire.MissionControl — простенькая библиотека для запуска задач Fire‑and‑Forget, кому‑то её функционала будет более чем достаточно, но всё по сравнению с Hangfire.Dashboard.Management.v2 её возможности весьма ограничены.

FaceIT.Hangfire.Tags

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

Hangfire.HttpJob

Библиотека для создания задачи через HTTP‑запрос, может очень пригодиться для интеграции как с внешними системами, так и с внутренними.

url:http://{hangfireserver}/hangfire/httpjob?op=backgroundjob
method:post
data:
{
  "Method": "POST",
  "ContentType": "application/json",
  "Url": "http://XXXXXXX",
  "DelayFromMinutes": 1,
  "Data": "{\"userName\":\"test\"}",
  "Timeout": 5000,
  "BasicUserName": "",
  "BasicPassword": "",
  "JobName": "test_backgroundjob"
}

Hangfire.HttpJob так же предоставляет HTTP Client для планирования задач из кода.

var serverUrl = "http://localhost:5000/job";
var result = HangfireJobClient.AddBackgroundJob(serverUrl, new BackgroundJob
{
    JobName = "myapi",
    Method = "Get",
    Url = "http://localhost:5000/testaaa",
    Mail = new List<string> {"1877682825@qq.com"},
    SendSucMail = true,
    DelayFromMinutes = 1
}, new HangfireServerPostOption
{
    BasicUserName = "admin",
    BasicPassword = "test"
});

TransactHangfire

У вас была такая ситуация, что необходимо выполнить две задачи в рамках одной транзакции? Если честно, то у меня тоже нет, но библиотека TransactHangfire позволяет это сделать. Нужно просто повесить на класс атрибут UseTransactionScope и вуаля, теперь две задачи объединены одним TransactionScope.

OpenTelemetry.Instrumentation.Hangfire

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

Заключение

В этой небольшой статье я осветил наиболее интересные на мой взгляд библиотеки, которые расширяют стандартные возможности Hangfire. Основываясь на моём опыте, могу сказать, что практически везде, где мне приходилось использовать Hangfire, я добавлял связку со следующими библиотеками: Hangfire.Console, Hangfire.Console.Extensions, Hangfire.Dashboard.Management.v2, FaceIT.Hangfire.Tags, OpenTelemetry.Instrumentation.Hangfire.

Комментарии (2)


  1. Alegz
    14.10.2023 10:06

    Вы не в курсе, у него сейчас есть нормальный провайдер для PostgreSQL или он работает только с MS SQL? Пользовался им последний раз в 2016 году, не смог настроить работу под PostgreSQL


    1. 1kvin Автор
      14.10.2023 10:06

      Да, есть - Hangfire.PostgreSql. Но на сколько мне известно есть некоторые проблемы при работе с Hangfire.Pro.