ABP-Hangfire定时任务

前言:

什么是定时任务?顾名思义就是在固定一段时间,执行固定一段任务。如同闹钟每天定时叫你起床。

我们可以利用定时任务,让系统在固定时间执行一个方法。

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就可以打开我们的仪表盘了。可以操作我们的定时任务

ABP-Hangfire定时任务_第1张图片

第二步:使用

一:每次调用的时候执行:

 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");

ABP-Hangfire定时任务_第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接口测试一下

ABP-Hangfire定时任务_第3张图片

第四步:管理周期性定时任务

周期性任务,在一个周期的当中有很多变化,我们必须要对他进行合理的管理。虽然他内置的仪表盘可以很方便地对周期性任务进行管理,但是拓展性不高。所以我们可以用以下方法对周期性任务进行控制。

删除周期性任务:

 
  1. //删除指定的周期性任务

  2. 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定时任务的时候,会自动在数据库创建以下的表。定时任务也是利用下面这些表来进行任务的控制的。

ABP-Hangfire定时任务_第4张图片

如果想在程序运行的时候注册,就直接在 service.Configure下添加就好了 

ABP-Hangfire定时任务_第5张图片

参考:

https://blog.csdn.net/WuLex/article/details/78454519

https://blog.csdn.net/anyusheng/article/details/78672965

你可能感兴趣的:(ABP开发框架,ABP-Hangfire)