Hangfire简介
Hangfire是一个开源的任务调度框架,它内置集成了控制页面,很方便我们查看,控制作业的运行;对于运行失败的作业自动重试运行。它支持永久性存储,支持存储于mssql,mysql,mongodb,redis等
想了解更多关于Hangfire,请移步hangfire官网https://www.hangfire.io/
简单使用Hangfire
第一步:创建WebApi项目承载任务调度
引入Hangfire和Hangfire.MySql.Core(因为我使用的mysql作为定时任务数据持久化的数据库,所以需要Hangfire.MySql.Core)
修改appsettings.json配置文件,添加持久化作业数据的数据库连接
"ConnectionStrings": { "DiseaseJobConnection": "Server=localhost;port=3306;Database=diseasejob;User Id=root;password=root23456;Allow User Variables=True" },
第二步、创建作业业务类
/// <summary> /// 疫情业务类 /// </summary> public class DiseaseService : IDiseaseService { private IHttpClientFactory _httpClientFactory = null; // private DiseaseDataContext _diseaseDataContext = null; /// <summary> /// /// </summary> /// <param name="httpClientFactory"></param> /// <param name="diseaseDataContext"></param> public DiseaseService(IHttpClientFactory httpClientFactory) //, DiseaseDataContext diseaseDataContext) { this._httpClientFactory = httpClientFactory; //_diseaseDataContext = diseaseDataContext; } /// <summary> /// 同步疫情 /// </summary> /// <returns></returns> public async Task<string> SyncDiseaseData() { //TODO同步疫情数据
return "";
}
第三步、在startup.cs中注入Hangfire
ConfigureServices方法中添加
services.AddHttpClient(); //注入HttpClient #region hangfire var storage = new MySqlStorage(Configuration.GetConnectionString("DiseaseJobConnection") , new MySqlStorageOptions { PrepareSchemaIfNecessary = true, TablePrefix = "Disease" }); //GlobalConfiguration.Configuration.UseStorage(new MySqlStorage(storage, new MySqlStorageOptions //{ // TransactionIsolationLevel = IsolationLevel.ReadCommitted, // 事务隔离级别。默认值为读提交。 // QueuePollInterval = TimeSpan.FromSeconds(15), // 作业队列轮询间隔。默认值为15秒 // JobExpirationCheckInterval = TimeSpan.FromHours(1), // 作业过期检查间隔(管理过期记录)。默认为1小时 // CountersAggregateInterval = TimeSpan.FromMinutes(5), // 间隔到聚合计数器。默认为5分钟 // PrepareSchemaIfNecessary = true, // 如果设置为true,则创建数据库表。默认值为true // DashboardJobListLimit = 50000, // 仪表板作业列表上限。默认值为50000 // TransactionTimeout = TimeSpan.FromMinutes(1), // 事务超时。默认为1分钟 //})); services.AddHangfire(p => p.UseStorage(storage)); #endregion services.AddScoped<DiseaseService>(); //注入业务
在Configure方法中
//hangfire app.UseHangfireServer(); app.UseHangfireDashboard(); //作业 RecurringJob.AddOrUpdate<DiseaseService>("SyncDiseaseInformation", p => p.SyncDiseaseData(), "0 9,12,18,0 * * ?");
-------------------------------
运行程序后切换到hangfire管理页面如下图: