背景
后台作業hangfire用來在后台里執行應用里的一些任務,后台作業是持久性的這意味着即使你的應用程序崩潰了, 后台作業也會在稍后重試並執行。平常我們一般是將數據持久化到存儲介質,比如redis。這時候就會帶來一個問題,如何防止數據無限擴大,我們可以已完成的job設置過期,防止數據無限增長。
解決方法
1、定義SucceededStateExpireHandler ,繼承IStateHandler。
using Hangfire.States; using Hangfire.Storage; using System; namespace CompanyName.ProjectName.Hangfire.Job.Code { /// <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) { } } }
2、設置過期時間。
JobExpirationTimeout = TimeSpan.FromMinutes(jobExpirationTimeout);
3、在ConfigureServices進行添加啟用。
public IServiceProvider ConfigureServices(IServiceCollection services) { .......................... GlobalStateHandlers.Handlers.Add(new SucceededStateExpireHandler(int.Parse(Configuration["Hangfire:JobExpirationTimeout"]))); }
總結
1、做數據的過期設置還是很有必要的,尤其是大數據量的情況下,可以有效的節約資源,提高速度。
2、對於有效期的時長,就要看自己的業務需要了。
