NetCore FluentScheduler 定时任务使用方式
引用 FluentScheduler
包
注册FluentSchedule服务
在程序入口 Program.cs 中注册服务
创建文件
定义扫描定时任务类 ServiceCollectionExtensions
using FluentScheduler;
using System.Reflection;
namespace Test.ServiceExtensions
{
/// <summary>
/// 扫描当前程序集下面所有的自定义 定时任务
/// </summary>
public static class ServiceCollectionExtensions
{
//扫描当前程序集中实现了Registry类
public static void AddFluentScheduler(this IServiceCollection services) {
var registrys = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => !t.IsInterface && !t.IsSealed && !t.IsAbstract && typeof(Registry).IsAssignableFrom(t))
.Select(s => s.Assembly.CreateInstance(s.FullName)as Registry)?.ToArray();
//注册同步服务
JobManager.Initialize(registrys);
}
}
}
定义我们要什么时间执行Job的任务 MySqlMigrationRegistry
继承Registry类,可以理解为:该任务执行的计划的作业调度时间策略
using Test.Tasks;
using FluentScheduler;
using Pomelo.EntityFrameworkCore.MySql.Migrations.Internal;
namespace Test.Jobs
{
/// <summary>
/// 设置任务时间
/// </summary>
public class MySqlMigrationRegistry:Registry
{
//常用的几种作业调度计划
// 1、 立即执行每10秒一次的计划任务。(指定一个时间间隔运行,根据自己需求,可以是秒、分、时、天、月、年等。)
//Schedule().ToRunNow().AndEvery(10).Seconds();
// 2、立即执行每10秒一次的计划任务。如果本次任务没有结束,下一次的任务则不会开始,禁止并行运行
// Schedule().NonReentrant().ToRunNow().AndEvery(10).Seconds();
// 3、在每天的21:15执行计划任务
// Schedule(() => Console.WriteLine("www.taohuayuan178.com It's 9:15 PM now.")).ToRunEvery(1).Days().At(21,15);
// 4、立即执行一个在每月的第一个星期一 3:00 的计划任务
//Schedule(() => Console.WriteLine("It's 3:00 AM now.")).ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3,0);
// 5、在每周一的21:15执行计划任务
// Schedule(() => Console.WriteLine("It's 9:15 PM now.")).ToRunEvery(1).Weeks().On(DayOfWeek.Monday).At(21,15);
public MySqlMigrationRegistry() {
//每一次任务都必须执行完成后,才能开启下一次执行,防止并发执行
NonReentrantAsDefault();
//更改状态任务 判断任务是否超时 每10分钟执行
Schedule<HourTask>().ToRunEvery(1).Minutes();
}
}
}
执行任务 HourTask
继承实现IJob接口,可以理解为:具体执行的任务业务逻辑是什么。
using FluentScheduler;
namespace Test.Tasks
{
/// <summary>
/// 具体执行的任务
/// </summary>
public class HourTask : IJob
{
/// <inheritdoc/>
public void Execute()
{
try
{
Console.WriteLine("正在执行任务!");
}
catch (Exception ex)
{
Console.WriteLine("执行任务失败!错误:"+ex.Message);
}
finally {
Console.WriteLine("任务结束!");
}
}
}
}