Abp集成HangFire開(kāi)源.NET任務(wù)調(diào)度框架
簡(jiǎn)要說(shuō)明
后臺(tái)作業(yè)在系統(tǒng)開(kāi)發(fā)的過(guò)程當(dāng)中,是比較常用的功能。因?yàn)榭偸怯幸恍╅L(zhǎng)耗時(shí)的任務(wù),而這些任務(wù)我們不是立即響應(yīng)的,例如 Excel 文檔導(dǎo)入、批量發(fā)送短信通知等。
ABP vNext 提供了后臺(tái)作業(yè)的支持,并且還提供了對(duì) HangFire 和 RabbitMQ 的后臺(tái)作業(yè)集成。開(kāi)發(fā)人員在使用這些第三方庫(kù)的時(shí)候,基本就是開(kāi)箱即用,不需要做其他復(fù)雜的配置。
ABP vNext 的實(shí)現(xiàn)就是在 CLR 的 Timer 之上封裝了一層,周期性地執(zhí)行用戶(hù)邏輯。
ABP vNext 默認(rèn)提供的 后臺(tái)任務(wù)管理器,就是在后臺(tái)作業(yè)基礎(chǔ)之上進(jìn)行的封裝。
涉及到后臺(tái)任務(wù)的模塊一共有 6 個(gè),它們分別是:
- Volo.Abp.Threading :提供了一些常用的線程組件,其中 AbpTimer 就是在里面實(shí)現(xiàn)的。
- Volo.Abp.BackgroundWorkers :后臺(tái)任務(wù)的定義和實(shí)現(xiàn)。
- Volo.Abp.BackgroundJobs.Abstractions :后臺(tái)任務(wù)的一些共有定義。
- Volo.Abp.BackgroundJobs :默認(rèn)的后臺(tái)任務(wù)管理器實(shí)現(xiàn)。
- Volo.Abp.BackgroundJobs.HangFire :基于 Hangfire 庫(kù)實(shí)現(xiàn)的后臺(tái)任務(wù)管理器。
- Volo.Abp.BackgroundJobs.RabbitMQ :基于 RabbitMQ 實(shí)現(xiàn)的后臺(tái)任務(wù)管理器。
什么是Hangfire
Hangfire 是一個(gè)開(kāi)源的.NET任務(wù)調(diào)度框架,目前1.6+版本已支持.NET Core。個(gè)人認(rèn)為它最大特點(diǎn)在于內(nèi)置提供集成化的控制臺(tái),方便后臺(tái)查看及監(jiān)控。
引用
<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" />
啟動(dòng)
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() { //活動(dòng)服務(wù)器超時(shí)時(shí)間 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), //計(jì)劃輪詢(xún)間隔 支持任務(wù)到秒 }; app.UseHangfireServer(jobOptions); } }
設(shè)置
/// /// 已完成的job設(shè)置過(guò)期,防止數(shù)據(jù)無(wú)限增長(zhǎng) /// 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集成HangFire開(kāi)源.NET任務(wù)調(diào)度框架的詳細(xì)內(nèi)容,更多關(guān)于Abp集成HangFire框架的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何在ASP.NET Core 的任意類(lèi)中注入Configuration
這篇文章主要介紹了如何在 ASP.NET Core 的任意類(lèi)中注入Configuration ,幫助大家更好的理解和學(xué)習(xí)使用.net技術(shù),感興趣的朋友可以了解下2021-04-04asp.net獲取當(dāng)前網(wǎng)址url的各種屬性(文件名、參數(shù)、域名 等)的代碼
用 asp.net獲取當(dāng)前網(wǎng)頁(yè)地址的一些信息。2010-07-07uniapp+.net?core實(shí)現(xiàn)微信小程序獲取手機(jī)號(hào)功能
這篇文章主要介紹了uniapp+.net?core實(shí)現(xiàn)微信小程序獲取手機(jī)號(hào)功能,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08在IIS上部署ASP.NET Core Web API的方法步驟
這篇文章主要介紹了在IIS上部署ASP.NET Core Web API的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08ASP.NET中GridView 重復(fù)表格列合并的實(shí)現(xiàn)方法
本文通過(guò)GridView 和 Repeater 解決有關(guān)表格顯示數(shù)據(jù)重復(fù)的數(shù)據(jù)列和并的方法,非常實(shí)用,感興趣的朋友一起看下吧2016-08-08