注意:
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配置文件,添加持久化作业数据的数据库连接

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

第二步、创建作业业务类

/// <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管理页面如下图

MS SQL Server的表

常用命令

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

配置权限

app.UseHangfireServer();
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
Authorization = new[] { new HangfireAuthorizationFilter() },
IgnoreAntiforgeryToken = true,
AppPath = "/swagger/index.html",
DashboardTitle = "Abc Sys Hangfire Dashboard"
});
app.AddOrUpdateJobs();
/// <summary>
/// HangfireAuthorizationFilter
/// </summary>
public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
{
/// <summary>
/// no authorize
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public bool Authorize(DashboardContext context)
{
return true;
}
}

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. 【干货】linux使用nginx一个80端口部署多个项目(spring boot、vue、nuxt、微信小程序)

    本人只有一个阿里云的ip和一个已经解析过的域名,然后想用80端口部署多个项目,比如输入: www.a.com和www.b.com与www.c.com就能访问不同项目,而不用输入不同端口号区分. 1.这 ...

  2. Linux 学习笔记02丨Linux 概述、常用快捷键、apt命令

    Chapter 1. Linux 概述 Linux 是一种自由和开放源码的 Unix 操作系统, 是一个基于 POSIX 和 UNIX 的多用户.多任务.支持多线程和多CPU的操作系统.只要遵循 GN ...

  3. C语言精华——内存管理,很多学校学习不到的知识~

    在编写程序时,通常并不知道需要处理的数据量,或者难以评估所需处理数据量的变动程度.在这种情况下,要达到有效的资源利用--使用内存管理,必须在运行时动态地分配所需内存,并在使用完毕后尽早释放不需要的内存 ...

  4. Mybatis学习-初步认知与使用

    Mybatis是一款优秀的持久层框架.且支持定制化SQL,存储过程以及高级映射 Mybatis几乎免除了所有的JDBC代码以及设置参数和获取结果集的工作,它使用简单的XML或注解来配置原始类型.接口和 ...

  5. 关于 spring security 对用户名和密码的校验过程

    1.执行 AuthenticationManager 认证方法 authenticate(UsernamePasswordAuthenticationToken) 2.ProviderManager ...

  6. 2020.11.30【NOIP提高A组】模拟赛反思

    90,rk42 T1 考试的时候觉得可以贪心,就每次找到最大的,然后以它为根去遍历每个子树,求出其最大值,然后删去这个点.一直持续直到边删完,时间复杂度\(O(n^2)\),然后想了想链的情况,没有打 ...

  7. (四)CPU主频与”性能“

    一.什么是性能 CPU的性能就是就是时间的倒数,简单来说:耗时越少,性能越好,主要包含下面两个指标: 响应时间:程序执行耗时 吞吐率:单位时间处理数据或执行程序的量 缩短响应时间,一定时间内可以执行更 ...

  8. Python+爬虫+xlwings发现CSDN个人博客热门文章

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 最近几天老猿博客的访问量出现了比较大的增长,从常规的1000-3000之间波动的范围一下子翻了将近一倍,粉丝增长从日均10-40人也增长了差不多一倍 ...

  9. 十. Axios网络请求封装

    1. 网络模块的选择 Vue中发送网络请求有非常多的方式,那么在开发中如何选择呢? 选择一:传统的Ajax是基于XMLHttpRequest(XHR) 为什么不用它呢?非常好解释配置和调用方式等非常混 ...

  10. vue之keep-alive组件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...