使用 .NET 构建可靠、自我维持的 API 时,计划一个或多个后台任务几乎是不可避免的。一些软件包已经存在多年,例如 Hangfire 和 Quartz.NET。
ASP.NET Core 允许将后台任务实现为托管服务。但是,您可能需要一些更可自定义和轻量级的东西,语法更简单。我介绍Coravel。
Cravel是一个用于.NET的开源轻量级库,允许您在 ASP.NET Core应用程序中轻松执行后台处理和调度。Cravel通过使任务/作业调度、排队、缓存、邮件(等等)等高级应用程序功能易于访问和易于使用,帮助开发人员快速启动和运行他们的.NET应用程序。
调度语法
Coravel 的灵感来自 Laravel 的任务计划程序,它建立在 .NET Core 内置依赖项注入之上。它使用 Fluent API 来计划任务,让您轻松指定任务的频率、开始时间和结束时间。它还提供了一种对后台作业进行排队和处理的简单方法,使您能够轻松处理大量数据或执行长时间运行的任务。
为什么使用Cravel进行调度?
Coravel Pro是一个专业的管理面板,具有可无缝集成到.NET Core应用中的可视化工具。
功能包括:
如果你喜欢 Coravel,正在使用 EF Core 生成 .NET Core 应用,并且想要更多很棒的工具,请查看!
Coravel 是专为 .NET Core 应用设计的 .NET Standard 库。 将 Coravel 包含在现有 .NET Core 应用程序(版本 2.1.0+)或其他 .NET Standard 项目中。
Coravel 需要 nuget 包才能开始使用。Coravel
dotnet add package coravel
通常,您必须通过 Windows 任务计划程序配置 cron 作业或任务,才能运行单个或多个重复出现的任务。
使用 Coravel,您可以使用简单、优雅、流畅的语法在一个地方设置所有计划任务——在代码中!
可调用对象表示应用程序中的独立作业。创建可调用对象使用共享接口。使用 .NET Core 的依赖项注入服务,可调用项将在执行时注入其所有依赖项。Coravel.Invocable.IInvocable
下面是创建可调用 (Job) 的示例代码:
public class ExpiryJobInvocable : IInvocable
{
private readonly ICatalogueService _catalogueService;
private readonly ILogger<ExpiryJobInvocable> _logger;
public ExpiryJobInvocable(ICatalogueService catalogueService, ILogger<ExpiryJobInvocable> logger)
{
_logger = logger;
_catalogueService = catalogueService;
}
public async Task Invoke()
{
await _catalogueService.ExpireCatalogueListing();
}
}
使用依赖注入注册可调用文件如下所示:
public static IServiceCollection RegisterCoravelScheduler(this IServiceCollection services)
{
services.AddScheduler();
services.AddTransient<ExpiryJobInvocable>();
return services;
}
另外,不要忘记通过指定频率在应用程序构建器中注册。它公开了预配置的方法,其中包括 cron 表达式语法。
var app = builder.Build();
app.Services.UseScheduler(scheduler =>
{
scheduler.Schedule<ExpiryJobInvocable>().EveryMinute().PreventOverlapping(nameof(ExpiryJobInvocable));
}).LogScheduledTaskProgress(app.Services.GetRequiredService<ILogger<IScheduler>>());
以下是可用于指定频率的方法:
//
// Summary:
// Defines methods available to you for specifying the frequency of how often your
// scheduled tasks will run.
public interface IScheduleInterval
{
IScheduledEventConfiguration EveryMinute();
IScheduledEventConfiguration EveryFiveMinutes();
IScheduledEventConfiguration EveryTenMinutes();
IScheduledEventConfiguration EveryFifteenMinutes();
IScheduledEventConfiguration EveryThirtyMinutes();
IScheduledEventConfiguration Hourly();
IScheduledEventConfiguration HourlyAt(int minute);
IScheduledEventConfiguration Daily();
IScheduledEventConfiguration DailyAtHour(int hour);
IScheduledEventConfiguration DailyAt(int hour, int minute);
IScheduledEventConfiguration Weekly();
IScheduledEventConfiguration Monthly();
IScheduledEventConfiguration Cron(string cronExpression);
IScheduledEventConfiguration EverySecond();
IScheduledEventConfiguration EveryFiveSeconds();
IScheduledEventConfiguration EveryTenSeconds();
IScheduledEventConfiguration EveryFifteenSeconds();
IScheduledEventConfiguration EveryThirtySeconds();
IScheduledEventConfiguration EverySeconds(int seconds);
}
除了任务调度之外,Cravel还支持其他功能。我总结了其中的一些,并随意使用它们。
Corevel为您提供了一个在内存中运行的零配置队列。这对于将冗长的任务卸载到后台非常有用,而不是让用户等待其 HTTP 请求完成。
有关使用 Coravel 的队列功能的更多信息,请查看文档页面e。
Cravel提供了一个易于使用的API,用于在.NET Core应用程序中进行缓存。默认情况下,它使用内存中缓存。Corevel还提供了一些数据库驱动程序,用于更强大的方案。
有关使用 Coravel 的缓存功能的更多信息,请查看文档页面。
Coravel 的事件广播允许侦听器订阅应用程序中发生的事件。这是构建可维护应用程序的好方法,其部件是松散耦合的!
有关使用 Coravel 事件功能的更多信息,请查看文档页面。
电子邮件并不像应有的那么容易。幸运的是,卡拉维尔通过提供以下功能解决了这个问题:
Cravel使用Mailables发送邮件。每个 Mailable 都是一个 c# 类,表示您可以发送的特定类型的电子邮件,例如“新用户注册”、“已完成的订单”等。