本文介绍如何在ASP.NET Core中使用Hangfire任务调度框架。
首页> 学海无涯> .NET Core> .NET任务调度框架Hangfire
.NET任务调度框架Hangfire
摘要 本文介绍如何在ASP.NET Core中使用Hangfire任务调度框架。

开发环境

Visual Studio 2019 16.8.3

ASP.NET Core 5.0

目录导航

一、前言

二、ASP.NET Core 中集成Hangfire

    1.安装程序包

    2.创建数据库

    3.注入服务

    4.添加仪表板

    5.启用Hangfire服务器

    6.使用Hangfire客户端

    7.运行程序

三、结语

文章正文

一、前言

    在Hangfire系列文章《.NET任务调度框架Hangfire(一):快速入门》中介绍了Hangfire的特点、工作方式和基本用法等,如此文有不懂的地方,可以看看前文,此处就不多做介绍,直接开始在ASP.NET Core中实操Hangfire任务调度框架。  

二、ASP.NET Core中集成Hangfire  

此处我们使用SQL Server作为存储介质。

1.安装程序包

在ASP.NET Core中使用Hangfire需要三个程序包:Hangfire.Core、Hangfire.SqlServer、Hangfire.AspNetCore,从Nuget安装最新的即可。Hangfire.AspNetCore包依赖于Hangfire.Core,所以此处也可以省略Hangfire.Core的安装。

2.创建数据库

Hangfire通过存储介质进行持久化,所以需要先创建数据库。由于我们这里使用SQL Server作为,所以需要先创建SQL Server数据库,可以使用SQL Server Management Studio或执行SQL语句来创建数据库。

3.注入服务

在Startup.cs的ConfigureServices方法中,使用依赖注入添加Hangfire服务,同时进行配置。

public void ConfigureServices(IServiceCollection services)
{
#region HangFire注入
//需要程序包:Hangfire.AspNetCore包含Hangfire.Core
services.AddHangfire(config =>
{
config.SetDataCompatibilityLevel(CompatibilityLevel.Version_170) //设置兼容性
.UseSimpleAssemblyNameTypeSerializer() //使用简单程序集名称类型序列化
.UseRecommendedSerializerSettings() //使用推荐的序列化配置
//需要程序包:Hangfire.SqlServer
.UseSqlServerStorage("数据库链接字符串", new SqlServerStorageOptions()
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), //超时时间
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), //滑动超时
QueuePollInterval = TimeSpan.Zero, //队列轮训间隔
UseRecommendedIsolationLevel = true, //
UsePageLocksOnDequeue = true, //出列时是否需要锁
DisableGlobalLocks = true //是否禁用全局锁
});
});
//将Hangfire处理服务器添加为IHostedService
//此处添加后就不需要使用HangfireServer中间件,无需调用app.UseHangfireServer()。
//services.AddHangfireServer();
#endregion
services.AddControllersWithViews();
}

此处注入了Hangfire服务器,就不需要使用Hangfire服务器中间件,二者使用其一。 

4.添加仪表板

仪表板是Hangfire的特色之一,在ASP.NET Core中,可以通过网页形式展现。

app.UseHangfireDashboard(); //引入Hangfire仪表板中间件

默认情况下,Hangfire仪表板板只允许本地访问,需要配置仪表板授权才可以远程访问: 

//需要包:Hangfire.AspNetCore
app.UseHangfireDashboard("/hangfire", new DashboardOptions()
{
//需要包:Hangfire.Dashboard.BasicAuthorization
Authorization = new BasicAuthAuthorizationFilter[] {
new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions{
SslRedirect=true,
RequireSsl = true,
Users = new BasicAuthAuthorizationUser[]{
new BasicAuthAuthorizationUser(){
Login = "leo",
PasswordClear = "123321"
}
}
})
}
}); //可视化界面 仪表盘


第一个参数是仪表盘访问路径,第二个参数是仪表盘配置,其中可以配置授权,此处添加了一个用户名密码。

输入用户名密码:

 



此外还可以通过实现IDashboardAuthorizationFilter接口来自定义授权:

首先,新建自定义权限类:CustomerHangfireAuthorizationFilter

public class CustomerHangfireAuthorizationFilter : IDashboardAuthorizationFilter
{
public bool Authorize([NotNull] DashboardContext context)
{
var httpContext = context.GetHttpContext();
// 可在此处自定义权限验证。
// 当前表示所有认证用户都可访问仪表盘
return httpContext.User.Identity.IsAuthenticated;
}
}

然后,将其添加到DashboardOptions中: 

//需要包:Hangfire.AspNetCore
app.UseHangfireDashboard("/hangfire", new DashboardOptions()
{
//自定义权限验证
Authorization = new CustomerHangfireAuthorizationFilter[] {
new CustomerHangfireAuthorizationFilter()
}
}); //可视化界面 仪表盘

5.启用Hangfire服务器

app.UseHangfireServer();    //启动Hangfire服务器

此处添加后就不需要在ConfigureService方法中调用service.AddHangfireServer(),二者选其一即可。  


6.使用Hangfire客户端

在ASP.NET Core程序任意地方通过依赖注入获取IBackgroundJobClient服务或者通过类RecurringJob、BackgroundJob中的静态方法即可添加任务。

例如在Configure方法中使用Hangfire客户端添加任务:


public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IBackgroundJobClient backgroundJobs)
{
//......
//需要包:Hangfire.AspNetCore
app.UseHangfireDashboard(); //可视化界面 仪表盘
//启动Hangfire服务器
app.UseHangfireServer();
//添加一次性任务 立即执行
backgroundJobs.Enqueue(() => Console.WriteLine("Hello world from Hangfire!"));
//......
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}

7.运行程序

可以看到控制台已经输出了“Hello world form Hangfire”:

 




三、结语  

1.将Hangfire集成到ASP.NET Core程序中,可以通过仪表盘观察到任务的执行情况,同时也可以删除作业,非常方便。

3.Hangfire系列终。 

附录

Hangfire.HttpJob介绍:

开源分布式Job系统,调度与业务分离-如何创建一个计划HttpJob任务

开源分布式Job系统,调度与业务分离-如何创建周期性的HttpJob任务

开源分布式Job系统,调度与业务分离-HttpJob.Agent组件介绍以及如何使用


感谢阅读,敬请斧正!  


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

本文链接:https://contione.cn/article/detail/31

本文配乐
来说两句吧
最新评论
  • 不想知道!
    不想知道!

    相关的定时调度组件还有类似的比如: Quartz.Net