NET 5使用HangFire定时任务
注意:
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定时任务的更多相关文章
- ASP.NET Core 使用 Hangfire 定时任务
定时任务组件,除了 Hangfire 外,还有一个 Quarz.NET,不过 Hangfire .NET Core 支持的会更好些. ASP.NET Core 使用 Hangfire 很简单,首先,N ...
- AspNetCore2 Hangfire定时任务
Hangfire 是一个简单的用于.net及.net core 应用程序,通过数据库持久化,定时执行后台任务的组件 1.通过NuGet安装Hangfire 2.在Startup.cs文件的Config ...
- Hangfire定时任务设置CronExpression表达式
Cron format helper This utility helps you build Cron expressions easily by choosing job scheduling s ...
- hangfire enqueued but not processing(hangfire 定时任务入队列但不执行)
不生效的方法 //RecurringJob.AddOrUpdate<FamilyAppService>((s) => s.UpdateFamilyLevel(), input.Cro ...
- 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 ...
- 解决 ASP.NET Core Hangfire 未授权(401 Unauthorized)
相关文章:ASP.NET Core 使用 Hangfire 定时任务 ASP.NET Core Hangfire 在正式环境发布之后,如果访问 http://10.1.2.31:5000/hangfi ...
- asp.net core 中hangfire面板的配置及使用
1.定义校验授权类DyDashboardAuthorizationFilter /// <summary> /// Hangfire仪表盘配置授权 /// </summary> ...
- .NET Core 添加Java 服务引用(WebService) 曲折历程(一)
背景: 需要在HangFire定时任务中加入请求Java开发的WebService接口.定时获取数据同步数据.现有的代码是在VS2017 ,.Net Core 下创建的,添加WS发现系统不支持. 在C ...
- Slickflow.NET 开源工作流引擎基础介绍(十) -- 邮件轮询异步发送模块集成
前言:在任务数据生成时,为了让办理任务的用户及时获取到待办任务的主题和内容,需要发送通知类的消息,而电子邮件和手机端的短信通知则是比较普通的消息发送.本文是针对电子邮件异步发送模块的实现来做实例说明. ...
随机推荐
- 【干货】linux使用nginx一个80端口部署多个项目(spring boot、vue、nuxt、微信小程序)
本人只有一个阿里云的ip和一个已经解析过的域名,然后想用80端口部署多个项目,比如输入: www.a.com和www.b.com与www.c.com就能访问不同项目,而不用输入不同端口号区分. 1.这 ...
- Linux 学习笔记02丨Linux 概述、常用快捷键、apt命令
Chapter 1. Linux 概述 Linux 是一种自由和开放源码的 Unix 操作系统, 是一个基于 POSIX 和 UNIX 的多用户.多任务.支持多线程和多CPU的操作系统.只要遵循 GN ...
- C语言精华——内存管理,很多学校学习不到的知识~
在编写程序时,通常并不知道需要处理的数据量,或者难以评估所需处理数据量的变动程度.在这种情况下,要达到有效的资源利用--使用内存管理,必须在运行时动态地分配所需内存,并在使用完毕后尽早释放不需要的内存 ...
- Mybatis学习-初步认知与使用
Mybatis是一款优秀的持久层框架.且支持定制化SQL,存储过程以及高级映射 Mybatis几乎免除了所有的JDBC代码以及设置参数和获取结果集的工作,它使用简单的XML或注解来配置原始类型.接口和 ...
- 关于 spring security 对用户名和密码的校验过程
1.执行 AuthenticationManager 认证方法 authenticate(UsernamePasswordAuthenticationToken) 2.ProviderManager ...
- 2020.11.30【NOIP提高A组】模拟赛反思
90,rk42 T1 考试的时候觉得可以贪心,就每次找到最大的,然后以它为根去遍历每个子树,求出其最大值,然后删去这个点.一直持续直到边删完,时间复杂度\(O(n^2)\),然后想了想链的情况,没有打 ...
- (四)CPU主频与”性能“
一.什么是性能 CPU的性能就是就是时间的倒数,简单来说:耗时越少,性能越好,主要包含下面两个指标: 响应时间:程序执行耗时 吞吐率:单位时间处理数据或执行程序的量 缩短响应时间,一定时间内可以执行更 ...
- Python+爬虫+xlwings发现CSDN个人博客热门文章
☞ ░ 前往老猿Python博文目录 ░ 一.引言 最近几天老猿博客的访问量出现了比较大的增长,从常规的1000-3000之间波动的范围一下子翻了将近一倍,粉丝增长从日均10-40人也增长了差不多一倍 ...
- 十. Axios网络请求封装
1. 网络模块的选择 Vue中发送网络请求有非常多的方式,那么在开发中如何选择呢? 选择一:传统的Ajax是基于XMLHttpRequest(XHR) 为什么不用它呢?非常好解释配置和调用方式等非常混 ...
- vue之keep-alive组件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...