背景
後臺作業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、對於有效期的時長,就要看自己的業務需要了。
本文分享自微信公衆號 - 一線碼農聊技術(dotnetfly)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。