首页 学海无涯 .NET Core .NET任务调度框架Hangfire(一):快速入门
.NET任务调度框架Hangfire(一):快速入门
摘要 本文主要讲Hangfire介绍、特点和入门使用。

开发环境

Visual Studio 2019 16.8.3 

.NET Core 5.0

目录导航

一、Hangfire介绍

    1.简介

    2.工作方式

    3.特点

二、Hangfire使用

    1.安装

    2.配置

    3.创建任务

    4.启动服务

三、总结

文章正文

一、Hangfire介绍

1.简介

Hangfire是一个开源的.NET任务调度框架,可以定时执行任务、延迟执行任务、以一定时间间隔重复执行任务等。

Hangfire具有可视化控制台,可以直观的看到任务调度情况。并且可以持久化存储,支持分布式任务调度。

2.工作方式

Hangfire有三个主要的组成部分:客户端、存储介质、服务器

客户端负责创建任务,将任务序列化后保存到指定存储介质。

存储介质可以是SQL Server、MySQL、Redis。

服务器用来处理任务,作为一个专用的后台线程,从存储介质中获取任务并处理任务,此外服务器还负责,存储介质中的数据清理。

3.特点

通过一张图了解:


来自hangfire官网,由英文翻译而来。

二、Hangfire使用

这里介绍简单的入门使用,在 控制台应用(.NET Core)中使用Hangfire,将SQL Server作为存储介质。

1.安装

首先需要安装Hangfire核心包:Hangfire.Core。其次,由于这里使用SQL Server作为存储介质,所以还需要安装:Hangfire.SqlServer。Hangfire.SqlServer依赖于hangfire.Core,所以通常我们只需要引入一个包:Hangfire.SqlServer就够了。

2.配置

GlobalConfiguration.Configuration
    .SetDataCompatibilityLevel(CompatibilityLevel.Version_110)  //设置兼容性
    .UseColouredConsoleLogProvider()    //彩色控制台
    .UseSimpleAssemblyNameTypeSerializer()  //使用简单程序集名称类型序列化
    .UseRecommendedSerializerSettings() //使用推荐的序列化配置
    //使用SQLServer存储 需要Hangfire.SqlServer包 需先创建数据库
    .UseSqlServerStorage("sql连接字符串", new SqlServerStorageOptions()
    {
        CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), //超时时间
        SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), //滑动超时
        QueuePollInterval = TimeSpan.Zero,  //队列轮训间隔
        UseRecommendedIsolationLevel = true,    //
        UsePageLocksOnDequeue = true,   //出列时是否需要锁
        DisableGlobalLocks = true   //是否禁用全局锁
    });

进行全局配置,由于Hangfire工作原理是将任务表达式序列化后存储到数据库,所以一般需要配置存储介质、序列化方式等。

注意:需要先手动创建数据库。

3.创建任务

一次性任务,立即执行

string jobId = BackgroundJob.Enqueue(() => Console.WriteLine("你好"));

参数是任务的表达式目录树。 

定期任务,多次执行

RecurringJob.AddOrUpdate(() => Console.WriteLine("你好"), "0/2 * * * * ?");

第一个参数是任务的表达式目录树,第二个参数是Cron表达式。此处表示从0秒开始,每2秒执行一次。

延迟任务,定点执行

string jobId = BackgroundJob.Schedule(() => Console.WriteLine("延迟"), TimeSpan.FromSeconds(10));

第一个参数是任务的表达式目录树,第二个参数是TimeSpan,在指定时间间隔后执行,仅执行一次。

延续任务,在某个任务完成后执行

string jobId = BackgroundJob.Enqueue(() => Console.WriteLine("你好"));
//在第一个任务执行之后执行
string jobId2 = BackgroundJob.ContinueJobWith(jobId, () => Console.WriteLine("继续任务"));

第一个参数是上一个任务的唯一标志符,第二个参数是任务的表达式目录树。

⑤传递依赖

interface IEmailHelper
{
    void Send(string msg)
    {
        Console.WriteLine("发送邮件:" + msg);
    }
}

public class EmailHelper : IEmailHelper { }

//传递IEmailHelper类,执行类里面的方法
string jobId = BackgroundJob.Enqueue(s => s.Send("你好"));

使用应用程序里的其他类来执行任务并保持代码简介。

4.启动服务

var serverOptions = new BackgroundJobServerOptions()
{
    SchedulePollingInterval = TimeSpan.FromSeconds(1)  //服务轮训时间  默认是15秒
};
using (var server = new BackgroundJobServer(serverOptions))
{
    Console.WriteLine("Hangfire Server started. Press any key to exit...");
    Console.ReadKey();
}

原本需要server.Start(),不过在2.0.0版本即将废弃,并且不需要调用Start()方法,自动启动。 

三、总结

Hangfire上手简单,永久存储,值得一试。

附录

Hangfire系列目录:

《.NET任务调度框架Hangfire(一):快速入门》

《.NET任务调度框架Hangfire(二):ASP.NET Core中使用》

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

中文文档:https://www.bookstack.cn/read/Hangfire-zh-official/README.md

感谢阅读,敬请斧正!  

版权声明:本文由不落阁原创出品,转载请注明出处!

本文链接:http://www.leo96.com/article/detail/58

来说两句吧
最新评论

暂无评论,大侠不妨来一发?