定时任务调度问题,是一个老生常谈的问题。网上有许多定时任务调度的解决方案,以前主要是使用Window计划和Window服务来做任务定时执行,然后就开始使用定时任务调度框架Quartz.Net。Hangfire这个自带后台任务调度面板,可以在后台手动执行任务的神奇的任务调度框架。
Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台,可以直观明了的查看作业调度情况,并且Hangfire不需要依赖于单独的应用程序执行(如:windows服务,window计划)。并且支持持久性存储。
最近在搞Hangfire任务,下面总结下几个设置
1、配置面板权限
var filter = new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions{SslRedirect = false,RequireSsl = false,LoginCaseSensitive = false,Users = new[]{new BasicAuthAuthorizationUser{Login = System.Configuration.ConfigurationManager.AppSettings["user"],PasswordClear = System.Configuration.ConfigurationManager.AppSettings["pwd"]}}});var options = new DashboardOptions{AuthorizationFilters = new[] {filter}};app.UseHangfireDashboard("/hangfire", options);
2、已完成的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){}
3、设置工作的线程数
app.UseHangfireServer(new BackgroundJobServerOptions { WorkerCount = int.Parse(System.Configuration.ConfigurationManager.AppSettings["WorkerCount"]) });
4、添加BackgroundJob
try{BackgroundJob.Enqueue(() => CreateJob(info));}catch (Exception ex){Logger.Default.Error("CreateJob失败 " + ex.ToString());}TextBuffer.WriteLine("Background job has been created.");