首页 学海无涯 .NET进阶 .NET任务调度框架Hangfire(二):ASP.NET Core中使用
.NET任务调度框架Hangfire(二):ASP.NET Core中使用
摘要 本文介绍如何在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.CoreHangfire.SqlServerHangfire.AspNetCore,从Nuget安装最新的即可。Hangfire.AspNetCore包依赖于Hangfire.Core,所以此处也可以省略Hangfire.Core的安装。

2.创建数据库

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

3.注入服务

Startup.csConfigureServices方法中,使用依赖注入添加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服务或者通过类RecurringJobBackgroundJob中的静态方法即可添加任务。

例如在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程序中,可以通过仪表盘观察到任务的执行情况,同时也可以删除作业,非常方便。

2.本来准备在Hangfire系列(三)介绍Hangfire.HttpJob的使用,但是发现作者已经写了三篇博客来介绍它,在此我就一句话简单介绍一下:

        Hangfire.HttpJob是一个第三方作者针对Hangfire开发的一个组件,该组件和Hangfire本身是独立的,且已被官方采纳,通过添加任务去调用WebAPI,它可以实现业务和调度分离。

3.Hangfire系列终。

附录

Hangfire系列目录:

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

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

Hangfire.HttpJob介绍:

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

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

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

感谢阅读,敬请斧正!

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

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

广告位

来说两句吧
最新评论

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