基于 abp vNext 和 .NET Core 开发博客项目 - 集成Hangfire实现定时任务处理

接下来,将完成一个任务调度中心,关于定时任务有多种处理方式,如果你的需求比较简单,比如就是单纯的过多少时间循环执行某个操作,可以直接使用.net core中内置的实现方式,新建一个类继承BackgroundService,实现ExecuteAsync()既可。

看一个例子,我们每过一秒输出一句HelloWorld,并写入日志中。

在.BackgroundJobs中新建一个Jobs文件夹,添加HelloWorldJob.cs,并且继承自BackgroundService。

//HelloWorldJob.cs using log4net; using Microsoft.Extensions.Hosting; using System; using System.Threading; using System.Threading.Tasks; namespace Meowv.Blog.BackgroundJobs.Jobs { public class HelloWorldJob : BackgroundService { private readonly ILog _log; public HelloWorldJob() { _log = LogManager.GetLogger(typeof(HelloWorldJob)); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { var msg = $"CurrentTime:{ DateTime.Now}, Hello World!"; Console.WriteLine(msg); _log.Info(msg); await Task.Delay(1000, stoppingToken); } } } }

然后在.HttpApi.Hosting层模块类中的ConfigureServices()注入context.Services.AddTransient<IHostedService, HelloWorldJob>();使用,运行一下看看效果。

0

可以看到已经成功输出了,你可以在ExecuteAsync()中做你的事件处理逻辑。这应该是最简单后台定时任务处理了,比较单一。

在abp框架中,官方给我们提供了许多后台工作的集成方式,有兴趣的可以自行研究一下,文档地址:https://docs.abp.io/zh-Hans/abp/latest/Background-Jobs

在本项目中,我将使用 Hangfire 来完成定时任务处理,为什么选择它呢?因为简单,开箱即用。下面进入正题,可以先将 HelloWorldJob 停掉。

在.BackgroundJobs中添加nuget包:Volo.Abp.BackgroundJobs.HangFire、Hangfire.MySql.Core、Hangfire.Dashboard.BasicAuthorization、Volo.Abp.AspNetCore,然后添加项目引用:.Domain。

在根目录新建模块类:MeowvBlogBackgroundJobsModule.cs,继承AbpModule,依赖AbpBackgroundJobsHangfireModule。

//MeowvBlogBackgroundJobsModule.cs using Hangfire; using Hangfire.MySql.Core; using Meowv.Blog.Domain.Configurations; using Meowv.Blog.Domain.Shared; using Volo.Abp; using Volo.Abp.BackgroundJobs.Hangfire; using Volo.Abp.Modularity; namespace Meowv.Blog.BackgroundJobs { [DependsOn(typeof(AbpBackgroundJobsHangfireModule))] public class MeowvBlogBackgroundJobsModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddHangfire(config => { config.UseStorage( new MySqlStorage(AppSettings.ConnectionStrings, new MySqlStorageOptions { TablePrefix = MeowvBlogConsts.DbTablePrefix + "hangfire" })); }); } public override void OnApplicationInitialization(ApplicationInitializationContext context) { var app = context.GetApplicationBuilder(); app.UseHangfireServer(); app.UseHangfireDashboard(); } } }

在ConfigureServices()中添加配置,因为之前选用了MySQL,所以这里引用了Hangfire.MySql.Core这个包,相对于的其它数据库可以在nuget上寻找。

在new MySqlStorage()中配置连接字符串,new MySqlStorageOptions()中配置表前缀,Hangfire会在第一次运行时,自动为我们创建表。

然后在OnApplicationInitialization()中进行使用,app.UseHangfireServer()必须调用,如果你不需要界面显示可以不用app.UseHangfireDashboard();

最后不要忘记,在.HttpApi.Hosting层模块类中依赖定时任务模块MeowvBlogBackgroundJobsModule。

现在运行一下项目,打开地址:.../hangfire 看看。

2

数据库默认已经为我们创建了hangfire所需的表。

3

有一个地方要注意,就是在连接字符串中需要开启用户变量,修改一下appsettings.json中的连接字符串,在末尾添加:Allow User Variables=True。

同时在app.UseHangfireDashboard()中,还支持很多配置项,现在我们这个定时任务是公开的,如果我们不想要外人访问,可以开启BasicAuth。

现在配置文件中配置Hangfire的登录账号和密码。

... "Hangfire": { "Login": "meowv", "Password": "123456" } ... ... /// <summary> /// Hangfire /// </summary> public static class Hangfire { public static string Login => _config["Hangfire:Login"]; public static string Password => _config["Hangfire:Password"]; } ...

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwswy.html