注意:
1. 当Hangfire服务由Web程序来启用时,默认情况下,web应用程序中的Hangfire服务器实例在第一个用户访问您的站点之前不会启动。甚至,有一些事件会在一段时间后导致web应用程序关闭(比如空闲超时应用程序池回收事件)。在这些情况下, “循环任务”和“延迟作业”将不会进入队列,而“进入队列的作业”将不会被处理。因此我们需要让ASP.NET应用程序始终运行。(详见官方的方法:Making ASP.NET application always running)

2. Hangfire Dashboard是一个你可以找到所有关于你的后台工作的信息的地方。它是作为一个OWIN中间件编写的(如果你不熟悉OWIN,也不用担心),所以你可以将它插入到你的 ASP.NET, ASP.NET MVC, Nancy, ServiceStack应用程序中,以及使用OWIN Self-Host 功能,在控制台应用程序或在Windows服务中托管Hangfire Dashboard服务。(详见官方说明: Using Dashboard)

前言:
  定时任务调度问题,是一个老生常谈的问题。网上有许多定时任务调度的解决方案,对于我而言很早以前主要是使用Window计划和Window服务来做任务定时执行,然后就开始使用定时任务调度框架Quartz.Net。但是却一直没有上手过Hangfire这个自带后台任务调度面板,可以在后台手动执行任务的神奇的任务调度框架。前段时间终于开始对他下手了,通过在网上查阅了一些资料和查看了Hangfire在Github中的demo,终于在我自己的项目中用上了Hangfire。在该篇文章中主要简单介绍一下什么是Hangfire,Hangfire的基本特征与优点和分别使用MySQL,MS SQL Server作为存储使用。

一、Hangfire是什么:

  hangfire官网https://www.hangfire.io/

  Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台,可以直观明了的查看作业调度情况,并且Hangfire不需要依赖于单独的应用程序执行(如:windows服务,window计划)。并且支持持久性存储。

二、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安装和使用:

第一步:创建WebApi项目承载任务调度

在ASP.NET 应用程序下使用Hangfire安装:

Install-Package Hangfire (SQlServer内置)

使用mysql作为存储时我们需要安装的NuGet:

Install-Package Hangfire.MySql.Core

修改appsettings.json配置文件,添加持久化作业数据的数据库连接

  1. <connectionStrings>
  2. <add name="sqlserver_connection" connectionString="Data Source=.;Initial Catalog=MyFirstDb;Integrated Security=True" providerName="System.Data.SqlClient" />
  3. </connectionStrings>

第二步、创建作业业务类

  1. /// <summary>
  2. /// 疫情业务类
  3. /// </summary>
  4. public class DiseaseService : IDiseaseService
  5. {
  6. private IHttpClientFactory _httpClientFactory = null;
  7. // private DiseaseDataContext _diseaseDataContext = null;
  8. /// <summary>
  9. ///
  10. /// </summary>
  11. /// <param name="httpClientFactory"></param>
  12. /// <param name="diseaseDataContext"></param>
  13. public DiseaseService(IHttpClientFactory httpClientFactory) //, DiseaseDataContext diseaseDataContext)
  14. {
  15. this._httpClientFactory = httpClientFactory;
  16. //_diseaseDataContext = diseaseDataContext;
  17. }
  18. /// <summary>
  19. /// 同步疫情
  20. /// </summary>
  21. /// <returns></returns>
  22. public async Task<string> SyncDiseaseData()
  23. {
  24.        //TODO同步疫情数据       return "";
  25. }

第三步、在startup.cs中注入Hangfire

ConfigureServices方法中添加

  1. services.AddHttpClient(); //注入HttpClient
  2. #region hangfire
  3. var storage = new MySqlStorage(Configuration.GetConnectionString("DiseaseJobConnection")
  4. , new MySqlStorageOptions { PrepareSchemaIfNecessary = true, TablePrefix = "Disease" });
  5. //GlobalConfiguration.Configuration.UseStorage(new MySqlStorage(storage, new MySqlStorageOptions
  6. //{
  7. // TransactionIsolationLevel = IsolationLevel.ReadCommitted, // 事务隔离级别。默认值为读提交。
  8. // QueuePollInterval = TimeSpan.FromSeconds(15), // 作业队列轮询间隔。默认值为15秒
  9. // JobExpirationCheckInterval = TimeSpan.FromHours(1), // 作业过期检查间隔(管理过期记录)。默认为1小时
  10. // CountersAggregateInterval = TimeSpan.FromMinutes(5), // 间隔到聚合计数器。默认为5分钟
  11. // PrepareSchemaIfNecessary = true, // 如果设置为true,则创建数据库表。默认值为true
  12. // DashboardJobListLimit = 50000, // 仪表板作业列表上限。默认值为50000
  13. // TransactionTimeout = TimeSpan.FromMinutes(1), // 事务超时。默认为1分钟
  14. //}));
  15. services.AddHangfire(p => p.UseStorage(storage));
  16. #endregion
  17. services.AddScoped<DiseaseService>(); //注入业务

在Configure方法中

  1. //hangfire
  2. app.UseHangfireServer();
  3. app.UseHangfireDashboard();
  4. //作业
  5. RecurringJob.AddOrUpdate<DiseaseService>("SyncDiseaseInformation", p => p.SyncDiseaseData(), "0 9,12,18,0 * * ?");

运行程序后切换到hangfire管理页面如下图

MS SQL Server的表

常用命令

  1. //支持基于队列的任务处理:任务执行不是同步的,而是放到一个持久化队列中,以便马上把请求控制权返回给调用者。
  2. var jobId = BackgroundJob.Enqueue(()=>WriteLog("队列任务执行了!"));
  3.  
  4. //延迟任务执行:不是马上调用方法,而是设定一个未来时间点再来执行,延迟作业仅执行一次
  5. var jobId = BackgroundJob.Schedule(()=>WriteLog("一天后的延迟任务执行了!"),TimeSpan .FromDays(1));//一天后执行该任务
  6.  
  7. //循环任务执行:一行代码添加重复执行的任务,其内置了常见的时间循环模式,也可基于CRON表达式来设定复杂的模式。【用的比较的多】
  8. RecurringJob.AddOrUpdate(()=>WriteLog("每分钟执行任务!"), Cron.Minutely); //注意最小单位是分钟
  9.  
  10. //延续性任务执行:类似于.NET中的Task,可以在第一个任务执行完之后紧接着再次执行另外的任务
  11. BackgroundJob.ContinueWith(jobId,()=>WriteLog("连续任务!"));

配置权限

  1. app.UseHangfireServer();
  2. app.UseHangfireDashboard("/hangfire", new DashboardOptions
  3. {
  4. Authorization = new[] { new HangfireAuthorizationFilter() },
  5. IgnoreAntiforgeryToken = true,
  6. AppPath = "/swagger/index.html",
  7. DashboardTitle = "Abc Sys Hangfire Dashboard"
  8. });
  9. app.AddOrUpdateJobs();
  1. /// <summary>
  2. /// HangfireAuthorizationFilter
  3. /// </summary>
  4. public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
  5. {
  6. /// <summary>
  7. /// no authorize
  8. /// </summary>
  9. /// <param name="context"></param>
  10. /// <returns></returns>
  11. public bool Authorize(DashboardContext context)
  12. {
  13. return true;
  14. }
  15. }

NET 5使用HangFire定时任务的更多相关文章

  1. ASP.NET Core 使用 Hangfire 定时任务

    定时任务组件,除了 Hangfire 外,还有一个 Quarz.NET,不过 Hangfire .NET Core 支持的会更好些. ASP.NET Core 使用 Hangfire 很简单,首先,N ...

  2. AspNetCore2 Hangfire定时任务

    Hangfire 是一个简单的用于.net及.net core 应用程序,通过数据库持久化,定时执行后台任务的组件 1.通过NuGet安装Hangfire 2.在Startup.cs文件的Config ...

  3. Hangfire定时任务设置CronExpression表达式

    Cron format helper This utility helps you build Cron expressions easily by choosing job scheduling s ...

  4. hangfire enqueued but not processing(hangfire 定时任务入队列但不执行)

    不生效的方法 //RecurringJob.AddOrUpdate<FamilyAppService>((s) => s.UpdateFamilyLevel(), input.Cro ...

  5. HangFire 定时任务

    https://www.cnblogs.com/ecin/p/6201262.html#%E5%9F%BA%E4%BA%8E%E9%98%9F%E5%88%97%E7%9A%84%E4%BB%BB%E ...

  6. 解决 ASP.NET Core Hangfire 未授权(401 Unauthorized)

    相关文章:ASP.NET Core 使用 Hangfire 定时任务 ASP.NET Core Hangfire 在正式环境发布之后,如果访问 http://10.1.2.31:5000/hangfi ...

  7. asp.net core 中hangfire面板的配置及使用

    1.定义校验授权类DyDashboardAuthorizationFilter /// <summary> /// Hangfire仪表盘配置授权 /// </summary> ...

  8. .NET Core 添加Java 服务引用(WebService) 曲折历程(一)

    背景: 需要在HangFire定时任务中加入请求Java开发的WebService接口.定时获取数据同步数据.现有的代码是在VS2017 ,.Net Core 下创建的,添加WS发现系统不支持. 在C ...

  9. Slickflow.NET 开源工作流引擎基础介绍(十) -- 邮件轮询异步发送模块集成

    前言:在任务数据生成时,为了让办理任务的用户及时获取到待办任务的主题和内容,需要发送通知类的消息,而电子邮件和手机端的短信通知则是比较普通的消息发送.本文是针对电子邮件异步发送模块的实现来做实例说明. ...

随机推荐

  1. Java基础教程——枚举类型

    枚举类型 枚举类型在JDK 5时引入. enum WeekEnum { MONDAY, TUESDAY, WEDNESDAY, THURDAY, FRIDAY, SATURDAY, SUNDAY } ...

  2. 朴素的模式匹配算法BF

    1 #include <iostream> 2 using namespace std; 3 int BF(char S[], char T[]); 4 int main() 5 { 6 ...

  3. Android动画系列之属性动画

    原文首发于微信公众号:jzman-blog,欢迎关注交流! 属性动画相较帧动画和补间动画更强大,帧动画和补间动画只能应用于 View 及其子类,而属性动画可以修改任何对象的属性值,属性值可在指定的一段 ...

  4. 第三十七章、PyQt输入部件:QAbstractSlider派生类QScrollBar滚动条、QSlider滑动条、QDial刻度盘功能介绍

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 Designer中的输入部件Horizo ...

  5. 第三十四章、PyQt中的输入部件:QComboBox组合框功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 Designer中输入工具部件中的Combo Box组合框与 ...

  6. 第九章、Qt Designer可视化设计界面布局组件介绍

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 在Qt Designer中,在左边部件栏的提供了界面布局相关部件,如图: 可以看到共包含有 ...

  7. SLR(1)语法分析(JAVA实现)

    要求 代码 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util. ...

  8. PostMan参数传递

    一.先取出返回中需要用的值,并设置变量 二.传入下一接口中

  9. 总结下flask中的宏、Jinjia2语法

    这几天学的东西比较多,时间又有点不够用,趁着快吃饭了,赶紧总结总结. 00x1 宏: 如果学过C语言的童鞋,可能知道宏在C语言里面是一个定义一个固定参数的变量.在flask里面,宏是相当于一个函数的作 ...

  10. 判断wangeidtor中输入框内容为空

    在我做的项目中,产品没有要求图片多媒体等,暂时只需要标题正文表格之类的,在保存的时候校验内容不为空 刚开始考虑的是editor.txt.html()获取到html片段在判断标签中的值,但是太过繁琐 后 ...