前言:
什么是定时任务?顾名思义就是在固定一段时间,执行固定一段任务。如同闹钟每天定时叫你起床。
我们可以利用定时任务,让系统在固定时间执行一个方法。
Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库。在.net core的环境中,由Core自带的DI管理着生命周期,真正做到开箱即用。
个人认为它最大特点在于内置提供集成化的控制台,方便后台查看及监控:
那么我们在ABP框架怎么配置定时任务呢?
HangFire基本结构:
客户端(创建任务)、服务端(执行任务)、数据库(存储任务列表和执行状况)、仪表盘(在网站上对任务进行监控查看和各种操作)
第一步:部署
我们需要安装三个包:
Hangfire.Core
Hangfire.SqlServer或(MySQL数据库,Hangfire.MySQL.Core)对应自己的数据库,但SQL会比较稳定
Hangfire.MemoryStorage.Core
然后在控制台运行:Install-Package Hangfire
然后其他用到定时服务的层安装:Hangfire.Core一个就可以了
配置
然后打开Host层(展示层)的Startup.cs类
在ConfigureServices 方法中注册服务
(此方法由运行时调用。使用此方法将服务添加到容器中。)
这里是配置数据库,数据库需要确保存在,这里配置的是SQL Server数据库:
public void ConfigureServices(IServiceCollection services)
{
services.AddHangfire(r => r.UseSqlServerStorage("Data Source=***;Initial Catalog=数据库名;User ID=sa;Password=密码"));
}
然后在Configure 方法中加入HangfireServer及HangfireDashboard:
(此方法由运行时调用。此方法由运行时调用。使用此方法配置HTTP请求管道。使用此方法将服务添加到容器中。)
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseHangfireServer();
app.UseHangfireDashboard(); //打开仪表盘
......略
}
上面2步,我们就打开了我们的定时任务服务,和打开了仪表盘,如果不行使用仪表盘业务可以不添加。
看看仪表盘效果吧:在网址后面输入/hangfire就可以打开我们的仪表盘了。可以操作我们的定时任务
第二步:使用
一:每次调用的时候执行:
BackgroundJob.Enqueue(() => Console.WriteLine("我只执行一次!!!!"));
二:延迟任务执行
例如,在注册后的一天向新注册的用户发送电子邮件。
BackgroundJob.Schedule(() => Console.WriteLine($"我是1分钟后执行一次"), TimeSpan.FromMinutes(1));
好呀很多延迟,一个小时的,延迟一天的等等。。。。很多
三.定时执行
RecurringJob.AddOrUpdate("2", () => Console.Write("我每隔2分钟执行一次"), Cron Cron.MinuteInterval(2));
当然还有按年的,按月..很多,具体看看Cron这个类就知道了
RecurringJob.AddOrUpdate("周期任务的名字",() => Console.Write("Powerful!"), "0 12 /2");
四. 延续性任务
延续性任务类似于.NET中的Task
,可以在第一个任务执行完之后紧接着再次执行另外的任务:
如,我等待,指定的父亲Id的定时任务完成在执行
具体父亲Id在在JobParameter表中
var parentId = BackgroundJob.Enqueue(() => Console.WriteLine("我只执行一次!!!!"));
BackgroundJob.ContinueWith(parentId, () => Console.Write("我是延续性任务"));
第三步:测试看看效果:
我们把,这些任务写进Test接口中,我一旦调用Test接口这些任务就会创建。
不用担心重复创建的问题因为他们同名的任务只会创建一次
public string Test()
{
BackgroundJob.Enqueue(() => Console.WriteLine("我只执行一次!!!!"));
BackgroundJob.Schedule(() => Console.WriteLine($"我是1分钟后执行一次"), TimeSpan.FromMinutes(1));
RecurringJob.AddOrUpdate("2", () => Console.Write("我每隔2分钟执行一次"), Cron.MinuteInterval(2));
BackgroundJob.ContinueWith(JobId, () => Console.Write("我是延续性任务"));
return "Heelo World";
}
调用Test接口测试一下
第四步:管理周期性定时任务
周期性任务,在一个周期的当中有很多变化,我们必须要对他进行合理的管理。虽然他内置的仪表盘可以很方便地对周期性任务进行管理,但是拓展性不高。所以我们可以用以下方法对周期性任务进行控制。
删除周期性任务:
-
//删除指定的周期性任务
-
RecurringJob.RemoveIfExists("周期任务的名字");
立即执行周期性任务:
RecurringJob.Trigger("周期任务的名字");
我们用个接口测试测试:
public string CreateCycle()
{
RecurringJob.AddOrUpdate("MyCycle", () => Console.Write("我每隔2分钟执行一次"), Cron.MinuteInterval(2));
return "开启周期任务";
}
public string ClosedCycle()
{
//删除指定的周期性任务
RecurringJob.RemoveIfExists("MyCycle");
return "关闭成功";
}
public string StartCycle()
{
RecurringJob.Trigger("MyCycle");
return "立即执行了";
}
番外:
在我们配置HangFire定时任务的时候,会自动在数据库创建以下的表。定时任务也是利用下面这些表来进行任务的控制的。
如果想在程序运行的时候注册,就直接在 service.Configure下添加就好了