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任务调度框架。
此处我们使用SQL Server作为存储介质。
在ASP.NET Core中使用Hangfire需要三个程序包:Hangfire.Core、Hangfire.SqlServer、Hangfire.AspNetCore,从Nuget安装最新的即可。Hangfire.AspNetCore包依赖于Hangfire.Core,所以此处也可以省略Hangfire.Core的安装。
Hangfire通过存储介质进行持久化,所以需要先创建数据库。由于我们这里使用SQL Server作为,所以需要先创建SQL Server数据库,可以使用SQL Server Management Studio或执行SQL语句来创建数据库。
在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服务器中间件,二者使用其一。
仪表板是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()
}
}); //可视化界面 仪表盘
app.UseHangfireServer(); //启动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?}");
});
}
可以看到控制台已经输出了“Hello world form Hangfire”:
1.将Hangfire集成到ASP.NET Core程序中,可以通过仪表盘观察到任务的执行情况,同时也可以删除作业,非常方便。
3.Hangfire系列终。
Hangfire.HttpJob介绍:
开源分布式Job系统,调度与业务分离-如何创建一个计划HttpJob任务
开源分布式Job系统,调度与业务分离-如何创建周期性的HttpJob任务
开源分布式Job系统,调度与业务分离-HttpJob.Agent组件介绍以及如何使用
感谢阅读,敬请斧正!
版权声明:本文由Contione原创出品,转载请注明出处!
相关的定时调度组件还有类似的比如: Quartz.Net
05/17/2024 00:08:24回复