Планирование Задач с Coravel
Coravel — легковесная библиотека с открытым кодом, которая добавляет в .NET-приложения планирование фоновых задач, постановку в очередь, кэширование, отправку почты и трансляцию событий — и всё это без необходимости в отдельной инфраструктуре.
Основные преимущества:
- Не требуется база данных или брокер сообщений;
- Идеально подходит для небольших и средних приложений;
- Полная интеграция с внедрением зависимостей ASP.NET Core;
- Чистый и читаемый синтаксис.
Посмотрим, что вы можете сделать с Coravel.
Планирование задач
Создаём задачу:
public class DailyReportJob : IInvocable
{
public Task Invoke()
{
// Отправляем ежедневный отчёт…
return Task.CompletedTask;
}
}
Регистрируем:
builder.Services.AddScheduler();
builder.Services.AddTransient<DailyReportJob>();
Планируем:
app.Services.UseScheduler(sch =>
{
sch
.Schedule<DailyReportJob>()
.DailyAtHour(6); // Каждый день в 6 утра
});
Также можно использовать:
-
.Hourly()-
.EveryMinute()-
.Weekly()-
.Cron("/5 *") для большего контроляОчередь фоновых задач
Можно избежать блокировки основного потока для таких задач, как отправка email или обработка файлов.
Создаём вызываемую задачу:
public class ProcessWebhook : IInvocable
{
public Task Invoke()
{
// Фоновая задача…
return Task.CompletedTask;
}
}
Ставим в очередь:
var dispatcher =
app.Services.GetService<IDispatcher>();
await dispatcher.EnqueueAsync<ProcessWebhook>();
Работает только в памяти: задачи теряются при перезапуске приложения. Идеально подходит для некритичных задач.
Трансляция событий
Система событий Coravel обеспечивает независимую связь между сервисами в одном приложении.
Определяем событие:
public record OrderPlacedEvent(int OrderId);
Создаём наблюдателя:
public class SendThankYouEmail :
IListener<OrderPlacedEvent>
{
public Task HandleAsync(OrderPlacedEvent e)
{
// Отправляем email о заказе e.OrderId…
return Task.CompletedTask;
}
}
Используем:
await dispatcher
.BroadcastAsync(new OrderPlacedEvent(123));
Рассылка писем с Razor-шаблонами
Определяем шаблон:
public class WelcomeMailable : Mailable<User>
{
public override void Build()
{
To(Model.Email)
.Subject("Добро пожаловать!")
.View("Emails.Welcome", Model);
}
}
Отправляем:
await mailer
.SendAsync(new WelcomeMailable(user));
Поддерживает отрисовку представлений из библиотек классов Razor или файлов .cshtml.
Простое кэширование
Встроенное кэширование в памяти для хранения часто используемых данных.
Хранение и извлечение из кэша:
var data = cache.GetOrAdd("top-products",
() => {
return FetchTopProducts();
},
TimeSpan.FromMinutes(15));
Не требует дополнительной настройки.
Итого
Coravel доказывает, что мощная фоновая обработка задач в .NET не обязательно должна быть сложной. Он позволяет сосредоточиться на бизнес-логике, а не на инфраструктуре, предоставляя все необходимое для быстрого создания отзывчивых и поддерживаемых приложений.
Источник: https://thecodeman.net/posts/job-scheduling-with-coravel