Abp集成HangFire
簡要說明
後台作業在系統開發的過程當中,是比較常用的功能。因為總是有一些長耗時的任務,而這些任務我們不是立即響應的,例如 Excel 文檔導入、批量發送簡訊通知等。
ABP vNext 提供了後台作業的支援,並且還提供了對 HangFire 和 RabbitMQ 的後台作業集成。開發人員在使用這些第三方庫的時候,基本就是開箱即用,不需要做其他複雜的配置。
ABP vNext 的實現就是在 CLR 的 Timer 之上封裝了一層,周期性地執行用戶邏輯。
ABP vNext 默認提供的 後台任務管理器,就是在後台作業基礎之上進行的封裝。
ABP vNext 默認提供的 後台任務管理器,就是在後台作業基礎之上進行的封裝。
涉及到後台任務的模組一共有 6 個,它們分別是:
-
Volo.Abp.Threading :提供了一些常用的執行緒組件,其中 AbpTimer 就是在裡面實現的。
-
Volo.Abp.BackgroundWorkers :後台任務的定義和實現。
-
Volo.Abp.BackgroundJobs.Abstractions :後台任務的一些共有定義。
-
Volo.Abp.BackgroundJobs :默認的後台任務管理器實現。
-
Volo.Abp.BackgroundJobs.HangFire :基於 Hangfire 庫實現的後台任務管理器。
-
Volo.Abp.BackgroundJobs.RabbitMQ :基於 RabbitMQ 實現的後台任務管理器。
什麼是Hangfire
Hangfire 是一個開源的.NET任務調度框架,目前1.6+版本已支援.NET Core。個人認為它最大特點在於內置提供集成化的控制台,方便後台查看及監控。
引用
<PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="1.0.2" /> <PackageReference Include="Volo.Abp.Autofac" Version="1.0.2" /> <PackageReference Include="Hangfire" Version="1.7.7" /> <PackageReference Include="Hangfire.AspNetCore" Version="1.7.7" /> <PackageReference Include="Hangfire.Dashboard.BasicAuthorization" Version="1.0.2" /> <PackageReference Include="Hangfire.Redis.StackExchange.StrongName" Version="1.7.0" />
啟動
public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddApplication(); var Configuration = services.GetConfiguration(); GlobalStateHandlers.Handlers.Add(new SucceededStateExpireHandler(int.Parse(Configuration["Hangfire:JobExpirationTimeout"]))); services.AddHostedService(); services.AddHangfire(x => { var connectionString = Configuration["Hangfire:Redis:ConnectionString"]; x.UseRedisStorage(connectionString, new RedisStorageOptions() { //活動伺服器超時時間 InvisibilityTimeout = TimeSpan.FromMinutes(60), Db = int.Parse(Configuration["Hangfire:Redis:Db"]) }); x.UseDashboardMetric(DashboardMetrics.ServerCount) .UseDashboardMetric(DashboardMetrics.RecurringJobCount) .UseDashboardMetric(DashboardMetrics.RetriesCount) .UseDashboardMetric(DashboardMetrics.AwaitingCount) .UseDashboardMetric(DashboardMetrics.EnqueuedAndQueueCount) .UseDashboardMetric(DashboardMetrics.ScheduledCount) .UseDashboardMetric(DashboardMetrics.ProcessingCount) .UseDashboardMetric(DashboardMetrics.SucceededCount) .UseDashboardMetric(DashboardMetrics.FailedCount) .UseDashboardMetric(DashboardMetrics.EnqueuedCountOrNull) .UseDashboardMetric(DashboardMetrics.FailedCountOrNull) .UseDashboardMetric(DashboardMetrics.DeletedCount); }); } public void Configure(IApplicationBuilder app, IConfiguration Configuration) { app.InitializeApplication(); app.UseAuthorization(); var filter = new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions { SslRedirect = false, RequireSsl = false, LoginCaseSensitive = false, Users = new[] { new BasicAuthAuthorizationUser { Login = Configuration["Hangfire:Login"] , PasswordClear= Configuration["Hangfire:PasswordClear"] } } }); app.UseHangfireDashboard("", new DashboardOptions { Authorization = new[] { filter }, }); var jobOptions = new BackgroundJobServerOptions { Queues = new[] { "critical", "test", "default" }, WorkerCount = Environment.ProcessorCount * int.Parse(Configuration["Hangfire:ProcessorCount"]), ServerName = Configuration["Hangfire:ServerName"], SchedulePollingInterval = TimeSpan.FromSeconds(1), //計劃輪詢間隔 支援任務到秒 }; app.UseHangfireServer(jobOptions); } }
設置
/// /// 已完成的job設置過期,防止數據無限增長 /// public class SucceededStateExpireHandler : IStateHandler { public TimeSpan JobExpirationTimeout; public SucceededStateExpireHandler(int jobExpirationTimeout) { JobExpirationTimeout = TimeSpan.FromMinutes(jobExpirationTimeout); } public string StateName => SucceededState.StateName; public void Apply(ApplyStateContext context, IWriteOnlyTransaction transaction) { context.JobExpirationTimeout = JobExpirationTimeout; } public void Unapply(ApplyStateContext context, IWriteOnlyTransaction transaction) { } }
結尾
更多的ABP相關問題和集成,歡迎您加入我的知識星球,或者我的QQ群:996767213。