今天無意中發現了一個很好用的任務調度框架。Hangfire作為一款高人氣且容易上手的分布式后台執行服務,支持多種數據庫。在 .net core的環境中,由Core自帶的DI管理着生命周期。
相較於quartz.net相比,最大的優點是有個自帶的監控界面,比較方便。最新版已經支持秒級任務。
基於隊列的任務處理(Fire-and-forget jobs)
基於隊列的任務處理是Hangfire中最常用的,客戶端使用BackgroundJob類的靜態方法Enqueue來調用,傳入指定的方法(或是匿名函數),Job Queue等參數.(類似MQ)
var jobId = BackgroundJob.Enqueue(
() => Console.WriteLine("Fire-and-forget!"));
延遲任務執行(Delayed jobs)
延遲(計划)任務跟隊列任務相似,客戶端調用時需要指定在一定時間間隔后調用:
var jobId = BackgroundJob.Schedule(
() => Console.WriteLine("Delayed!"),
TimeSpan.FromDays(7));
定時任務執行(Recurring jobs)
定時(循環)任務代表可以重復性執行多次,支持CRON表達式:
RecurringJob.AddOrUpdate(
() => Console.WriteLine("Recurring!"),
Cron.Daily);
延續性任務執行(Continuations)
延續性任務類似於.NET中的Task,可以在第一個任務執行完之后緊接着再次執行另外的任務:
BackgroundJob.ContinueWith(
jobId,
() => Console.WriteLine("Continuation!"));
基於SQL的實現
修改startup.cs類中的ConfigureServices()方法中注入
services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
UsePageLocksOnDequeue = true,
DisableGlobalLocks = true
}));
services.AddHangfireServer();
封裝一下
public static void AddHangfireExt(this IServiceCollection services, IConfiguration Configuration)
{
services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
UsePageLocksOnDequeue = true,
DisableGlobalLocks = true
}));
services.AddHangfireServer();
}
修改ConfigureServices方法
services.AddHangfireExt(Configuration);
修改Configure()方法
//啟用監控面板
app.UseHangfireDashboard();
//增加隊列任務
backgroundJobs.Enqueue(() => Console.WriteLine("Hello world from Hangfire!"));
RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring!"),Cron.Minutely);
我這里只做了SQL數據庫,建議改成redis,提高性能。
Hangfire UI
瀏覽器打開http://{host:poort}/hangfire/地址,可以看到如下界面:
-
儀表盤
-
可以看到周期性作業列表
還可以加上授權等,先介紹到這里,詳細文檔可以參考官方文檔。