Hangfire
作者:互联网
1. 概述
- Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台,可以直观明了的查看作业调度情况,并且Hangfire不需要依赖于单独的应用程序执行(如:windows服务,window计划)
- 支持持久性存储,开源且免费用于商业用途
- Hangfire支持自动重试功能,后台作业执行过程中遇到问题,则会在延迟一段时间后自动重试
2. 基本特征和优点
3. 要求
- Hangfire 适用于大多数 .NET 平台:.NET Framework 4.5 或更高版本、.NET Core 1.0 或更高版本,或与 .NET Standard 1.3 兼容的任何平台。您可以将其与几乎任何应用程序框架集成,包括 ASP.NET,ASP.NET Core,控制台应用程序,Windows服务,WCF以及社区驱动的框架,如Nancy或ServiceStack
4. 持久化
- Hangfire将后台作业序列化并持久化到数据库中,服务宕机重启后正在执行的作业将被重新激活
- 支持的数据库
- SQLServer 2008R2以及更高版本,免费
- PostgreSQL
- MongoDB
- Redis,收费
5. 后台作业类型
- 单次执行
- 延迟执行
- 重复执行
- 延续执行
- 批量执行
- 批量延续执行
6. 架构
- Hangfire有三个主要部分组成:客户端、存储介质、服务端
- 客户端:创建任务,将任务序列化后保存到指定的存储介质
- 存储介质:负责持久化任务
- 服务器:一个单独的后台线程从存储介质中获取并处理任务
7. 集成 Asp.Net Core Web API 并持久化到SQLServer
- 安装NuGet包
dotnet add package Hangfire.Core dotnet add package Hangfire.SqlServer dotnet add package Hangfire.AspNetCore
- 配置Hangfire
- 打开Startup.cs,在ConfigureServices方法中注册服务
public void ConfigureServices(IServiceCollection services) { services.AddHangfire(configuration => configuration .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) .UseSimpleAssemblyNameTypeSerializer() .UseRecommendedSerializerSettings() .UseSqlServerStorage(App.Configuration["ConnectionStrings:HangfireConnection"], new SqlServerStorageOptions { CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), QueuePollInterval = TimeSpan.Zero, UseRecommendedIsolationLevel = true, DisableGlobalLocks = true })); services.AddHangfireServer(); }
- 在Configure方法中配置仪表盘
app.UseHangfireDashboard("/hangfire", new DashboardOptions { Authorization = new[] { new DashboardAuthorizationFilter() }, DashboardTitle = "Zheng He" });
- 运行项目导航到/hangfire
- 打开Startup.cs,在ConfigureServices方法中注册服务
- 创建单次执行任务
BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
- 该方法不会立即调用目标方法,而是运行以下步骤
- 序列化方法信息及其所有参数
- 根据序列化信息创建新的后台作业
- 将后台作业保存到持久性存储
- 将后台作业排队到其队列
- 执行这些步骤后,该方法将立即返回给调用方。另一个Hangfire组件,称Hangfire Server,检查持久存储中排队的后台作业,并以可靠的方式执行它们
- 排队作业由专用的工作线程池处理。每个工作线程调用以下进程
- 获取下一个作业并将其隐藏起来
- 执行作业及其所有扩展筛选器
- 从队列中删除作业
- 因此只有在处理成功后才会删除作业。即使某个进程在执行期间被终止,Hangfire 也会执行补偿逻辑,以保证每个作业的处理
- 该方法不会立即调用目标方法,而是运行以下步骤
- 创建延迟执行任务
BackgroundJob.Schedule(() => Console.WriteLine("Hello, world"),TimeSpanFromDays(1));
- Hangfire Server会定期检查计划,以便将计划作业排队到其队列中,也可以通过控台手动触发。默认情况下定期检查的间隔15s,但可以通过在传递给构造器的选项上设SchedulePollingInterval属性来更改
var options = new BackgroundJobServerOptions { SchedulePollingInterval = TimeSpan.FromMinutes(1) }; var server = new BackgroundJobServer(options);
- Hangfire Server会定期检查计划,以便将计划作业排队到其队列中,也可以通过控台手动触发。默认情况下定期检查的间隔15s,但可以通过在传递给构造器的选项上设SchedulePollingInterval属性来更改
- 创建重复执行任务
RecurringJob.AddOrUpdate("easyjob", () => Console.Write("Easy!"), CronDaily);
- 创建延续执行任务
var jobId = BackgroundJob.Enqueue(() => Console.WriteLin("Fire-and-forget!")); //当上一个任务执行完成后,执行延续任务 BackgroundJob.ContinueJobWith(jobId,() => Console.WriteLine("Continuation!");
- 创建批量执行任务
var batchId = Batch.StartNew(x => { x.Enqueue(() => Console.WriteLine("Job 1")); x.Enqueue(() => Console.WriteLine("Job 2")); });
- 创建批量延续执行任务
Batch.ContinueBatchWith(batchId, x => { x.Enqueue(() => Console.WriteLine("Last Job")); });
标签:Console,后台作业,Hangfire,new,NET,执行 来源: https://www.cnblogs.com/iservice/p/15698789.html