Abp vNext 后台作业hangfire
概述
ABP vNext 提供了后臺工作者和后臺作業的支持,基本實現與原來的 ABP 框架類似,并且 ABP vNext 還提供了對 HangFire 和 RabbitMQ 的后臺作業集成。開發人員在使用這些第三方庫的時候,基本就是開箱即用,不需要做其他復雜的配置。
后臺作業在系統開發的過程當中,是比較常用的功能。因為總是有一些長耗時的任務,而這些任務我們不是立即響應的,例如 Excel 文檔導入、批量發送短信通知等。
后臺工作者?的話,ABP vNext 的實現就是在 CLR 的 Timer 之上封裝了一層,周期性地執行用戶邏輯。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<AppModule>();var Configuration = services.GetConfiguration();GlobalStateHandlers.Handlers.Add(new SucceededStateExpireHandler(int.Parse(Configuration["Hangfire:JobExpirationTimeout"])));services.AddHostedService<RecurringJobsService>();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);}}設置
/// <summary>/// 已完成的job設置過期,防止數據無限增長/// </summary>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){}}源碼下載
https://github.com/conanl5566/dotnet-core-Example/tree/master/WebApplication15%20-%20%E5%89%AF%E6%9C%AC
總結
以上是生活随笔為你收集整理的Abp vNext 后台作业hangfire的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Azure Show】|第九期 “我的
- 下一篇: 如何在 C# 中使用 委托