前言:
定时任务调度问题, 是一个老生常谈的问题. 网上有许多定时任务调度的解决方案, 对于我而言很早以前主要是使用 Windows 计划和 Windows 服务来做任务定时执行, 然后就开始使用定时任务调度框架 Quartz.NET. 但是却一直没有上手过 Hangfire 这个自带后台任务调度面板, 可以在后台手动执行任务的神奇的任务调度框架. 前段时间终于开始对他下手了, 通过在网上查阅了一些资料和查看了 Hangfire 在 GitHub 中的 demo, 终于在我自己的项目中用上了 Hangfire. 在该篇文章中主要简单介绍一下什么是 Hangfire,Hangfire 的基本特征与优点和分别使用 MySQL,MS SQL Server 作为存储使用.
一, Hangfire 是什么:
Hangfire 是一个开源的. NET 任务调度框架, 提供了内置集成化的控制台, 可以直观明了的查看作业调度情况, 并且 Hangfire 不需要依赖于单独的应用程序执行(如: Windows 服务, Windows 计划). 并且支持持久性存储.
二, Hangfire 使用条件:
Hangfire 与特定的. NET 应用程序类型无关. 您可以在 ASP.NET web 应用程序, 非 ASP.NET Web 应用程序, 控制台应用程序或 Windows 服务中使用它. 以下是要求:
1.NET Framework 4.5
2. 永久存储(Hangfire 将后台作业和其他与处理有关的信息保留在永久性存储器中, 所以需要存储库来存储如: MS SQL Server,Redis,MySQL,PostgreSQL 等)
3.Newtonsoft.JSON 库≥5.0.1
三, Hangfire 的基本特征与优点:
通过官网中的一张图片便可知道它是一个多么优秀的任务调度框架, 如下图所示:
四, Hangfire 安装和使用:
在 NuGet 上有关于 Hangfire 的 一系列软件包:
详情地址: https://www.nuget.org/packages?q=Hangfire
通过在程序包管理控制台中输入安装命令安装 Hangfire 所需 NuGet 包:
使用 MS SQL Server 作为存储时我们需要安装的 NuGet:
在 ASP.NET 应用程序下使用 Hangfire 安装:
Install-Package Hangfire
在控制台应用程序或者 Windows server 中处理作业:
- Install-Package Hangfire.Core
- Install-Package Hangfire.SqlServer
注意, 在控制台应用程序或者 Windows server 中不推荐直接安装: Install-Package Hangfire , 因为它只是一个快速启动软件包, 并包含您可能不需要的依赖项(例如, Microsoft.Owin.Host.SystemWeb 等无关依赖项).
使用 MySQL 作为存储时我们需要安装的 NuGet:
在 ASP.NET 应用程序下使用 Hangfire 安装:
Install-Package Hangfire.Core
我们还需要安装一个 MySQL 存储 (Hangfire.MySqlStorage) 的拓展, 注意因为 Hangfire 本身是不支持 MySQL 存储的, 这是名为: Arnoldas Gudas 作者拓展的:
Nuget 地址:
安装命令:
注意: 因为我的项目是. NET Framework,Version=v4.5.1 版本的, 所以只能安装 1.0.7 版本的, 大家看需求而定
Install-Package Hangfire.MySqlStorage -Version 1.0.7
当我们要使用(宿主)IIS 托管 ASP.NET 应用程序时, 我们还需要安装:
Install-Package Microsoft.Owin.Host.SystemWeb -Version 4.0.1
添加和配置 OWIN Startup.cs, 及其连接对应的存储数据库:
添加 OWIN Startup.cs
这里是当你的项目中不存在 Startup.cs 时才需要执行添加的操作!
什么是 OWIN Startup.cs:
简单概述: 是. NET 平台开放的 Web 接口, Startup 则是. Net 与 Web 通讯管道, 起到转发, 沟通的作用.
详情介绍: https://www.cnblogs.com/wj033/p/6065145.html
在 Startup.cs 中连接需要使用的存储库:
- public void Configuration(IAppBuilder App)
- {
- // 运用 SqlServer 存储, 对应 Web.config 中的 connectionStrings 中的 name
- GlobalConfiguration.Configuration.UseSqlServerStorage("sqlserver_connection");
- // 注意, 当你使用的是 MySQL 作为存储时, 需要如下配置
- // 运用 MySQL 存储, 对应 Web.config 中的 connectionStrings 中的 name
- GlobalConfiguration.Configuration.UseStorage(new MySqlStorage("mysql_connection"));
- App.UseHangfireDashboard();// 配置后台仪表盘
- App.UseHangfireServer();// 开始使用 Hangfire 服务
- }
Web.config 数据库配置:
1.MS SQL Server 中:
- <connectionStrings>
- <add name="sqlserver_connection" connectionString="Data Source=.;Initial Catalog=MyFirstDb;Integrated Security=True" providerName="System.Data.SqlClient" />
- </connectionStrings>
2.MySQL 中:
- <connectionStrings>
- <add name="mysql_connection" providerName="System.Data.MySqlClient" connectionString="Server=123.xxx.xxx.xx;Port=3306;Database=MyFirstDb;Uid=root;
- Pwd=youpassword;charset=utf8;SslMode=none;Allow User Variables=True" />
- </connectionStrings>
运行程序, 访问调度控制面板:
当我们已经完成了上面的相关配置后, 且程序能够正常无 bug 的运行时, 我们的 Hangfire Dashboard(仪表盘)在我们的本地就可以正常访问了(Hangfire 仪表盘默认只支持本地访问), 假如需要远程可访问的话我们还需要做对应的配置授权操作!
运行成功, 查看数据库中是否生成了与 Hangfire 相关的表:
首次运行成功后, 打开数据库可以看到 Hangfire 已经自动为我们创建了定时任务的一些定时任务列表, 定时队列, 服务, 状态等相关的数据表(展现了 Hangfire 作用的持久化特性), 如下图所示:
a.MS SQL Server 中生成的表:
b.MySQL 中生成的表:
访问调度控制面板:
本地访问方式: https://localhost: 端口号 / hangfire/
调度控制面板效果图:
后台常用任务调度创建和使用:
- // 支持基于队列的任务处理: 任务执行不是同步的, 而是放到一个持久化队列中, 以便马上把请求控制权返回给调用者.
- var jobId = BackgroundJob.Enqueue(() => WriteLog("队列任务"));
- // 延迟任务执行: 不是马上调用方法, 而是设定一个未来时间点再来执行, 延迟作业仅执行一次
- var jobId = BackgroundJob .Schedule(()=> Console .WriteLine(""),TimeSpan .FromDays(1));// 一天后执行该任务
- // 循环任务执行: 一行代码添加重复执行的任务, 其内置了常见的时间循环模式, 也可基于 CRON 表达式来设定复杂的模式.[用的比较的多]
- RecurringJob.AddOrUpdate(() => WriteLog("每分钟执行任务"), Cron.Minutely); // 注意最小单位是分钟
- // 延续性任务执行: 类似于. NET 中的 Task, 可以在第一个任务执行完之后紧接着再次执行另外的任务
- BackgroundJob.ContinueWith(jobId, () => WriteLog("连续任务"));
总结:
通过本次项目实践的确让我感受到了 Hangfire 的魅力所在, 真的可以说是上手简单, 开箱即用的一个任务调度框架. 并且该框架做的最好的是, 官方文档详细, 并且还提供了完整的 demo 示例. 最后要为 Hangfire 的作者点赞!
Hangfire 相关使用学习资料:
官网地址: https://www.hangfire.io/
GitHub 源码: https://github.com/HangfireIO/Hangfire
中文文档:
GitHub 使用示例源码: https://github.com/HangfireIO/Hangfire.Samples (包括控制台应用程序, Windows 服务, ASP.NET MVC,WebForm)
Hangfire 使用文章汇总: https://www.bbsmax.com/R/xl56E0nrJr/
来源: https://www.cnblogs.com/Can-daydayup/p/11610747.html