Введение
Hangfire — распределенный и расширяемый планировщик задач для приложений на.NET.
В этой статье я сделал небольшой обзор библиотек позволяющих расширить его возможности. Если вы не знаете что такое Hangfire, советую прочитать эту статью или заглянуть на официальный сайт.
Hangfire.Console
![](https://habrastorage.org/getpro/habr/upload_files/9a4/11c/596/9a411c596d81d6a55e8bf7e3e5453888.png)
Hangfire.Console — библиотека, добавляющая консоль для ведения задач. Данная библиотека позволяет выводить логи и так же добавлять прогресс бар. К сожалению, данная библиотека не обновлялась с 2018 года, но это не мешает использовать её в качестве основы для других библиотек.
![](https://habrastorage.org/getpro/habr/upload_files/af6/edb/468/af6edb4681cee550e4eedc0b7863daea.png)
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
![](https://habrastorage.org/getpro/habr/upload_files/2fa/2ed/eba/2fa2edeba8e54eb1484063311e596ffe.png)
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).
![](https://habrastorage.org/getpro/habr/upload_files/851/e57/0ea/851e570ea1f4da3f5115e9e1378c973f.png)
Данная библиотека управления задачами понравилась мне больше всего, но мы рассмотрим ещё один хороший вариант.
Hangfire.MissionControl
![](https://habrastorage.org/getpro/habr/upload_files/655/4a1/1d4/6554a11d4ef888374858358a1e006584.png)
Hangfire.MissionControl — простенькая библиотека для запуска задач Fire‑and‑Forget, кому‑то её функционала будет более чем достаточно, но всё по сравнению с Hangfire.Dashboard.Management.v2 её возможности весьма ограничены.
FaceIT.Hangfire.Tags
![](https://habrastorage.org/getpro/habr/upload_files/4c2/4a0/11a/4c24a011a42ed6807fa4b9e4dbdcda20.png)
Данная библиотека позволяет вешать теги на задачи, что бы потом их проще было найти. Мне не удалось найти другой библиотеки, которая предоставляла бы хороший поиск по задачам, поэтому если у вас огромное количество различных задач и вы хотите не потеряться в них, данная библиотека является незаменимой.
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
![](https://habrastorage.org/getpro/habr/upload_files/28a/066/8b8/28a0668b82161f5b19b3d55cc60a2b55.png)
Думаю, тут понятно всё из названия, собираем данные телеметрии. В параметрах задачи зашивается opentelemetry_activity_context по которому мы можем выйти на нашу телеметрию.
Заключение
В этой небольшой статье я осветил наиболее интересные на мой взгляд библиотеки, которые расширяют стандартные возможности Hangfire. Основываясь на моём опыте, могу сказать, что практически везде, где мне приходилось использовать Hangfire, я добавлял связку со следующими библиотеками: Hangfire.Console, Hangfire.Console.Extensions, Hangfire.Dashboard.Management.v2, FaceIT.Hangfire.Tags, OpenTelemetry.Instrumentation.Hangfire.
Alegz
Вы не в курсе, у него сейчас есть нормальный провайдер для PostgreSQL или он работает только с MS SQL? Пользовался им последний раз в 2016 году, не смог настроить работу под PostgreSQL
1kvin Автор
Да, есть - Hangfire.PostgreSql. Но на сколько мне известно есть некоторые проблемы при работе с Hangfire.Pro.