定时调度插件------FluentScheduler
使用说明
dll引用
- 文章使用的版本为5.5.1版本
- 使用GuGet搜索FluentScheduler即可找到
- 如果框架为.NET Framework4.5+,.NET Core 1.0+或.NET5.0+,可使用5.5.1最新版本
- 如果框架为.NET Framework4.0,则需要降低版本,下载5.3.0版本
- 源代码编译
- 源代码共三个项目,其中直接编译FluentScheduler即可,无需多余操作
官方说明
-
该组件不支持100ms以下的时间间隔
-
官方不建议使用:IJobFactory
-
不支持Cron
官方例子
-
最简洁代码
// 初始化 JobManager.Initialize(); // 添加调度任务 JobManager.AddJob( // 调度业务 () => Console.WriteLine("5 minutes just passed."), // 触发时间 s => s.ToRunEvery(5).Minutes() ); // 立即停止 JobManager.Stop(); // 在任务完成后等待或者停止 JobManager.StopAndBlock();
-
Schedules 自定义调度任务
FluentScheduler支持自定义Schedules,相当于在初始化的时候可以自定义很多调度任务,在程序运行时可根据实际业务情况移除特定任务或增加任务。
-
JobManager.Initialize(new MyRegistry()); //调度任务初始化
-
Registry直接添加任务
// 声明一个Registry类 var registry = new Registry(); // 每天21点15分执行一次 registry.Schedule(() => Console.WriteLine("It's 9:15 PM now.")).ToRunEvery(1).Days().At(21, 15); // 创建了一个叫"NonReentrant"的任务,在1秒后执行休眠1分钟,不重复(NonReentrant方法) registry.Schedule(() => Sleep(TimeSpan.FromMinutes(1)).NonReentrant().WithName("NonReentrant").ToRunEvery(1).Seconds(); //调度任务初始化 JobManager.Initialize(registry);
-
自定义调度任务:继承Registry类
// MyRegistry.cs public class MyRegistry : Registry { public MyRegistry() { // 让所有任务都不重复执行 NonReentrantAsDefault(); // 每天21点15分执行一次 Schedule(() => Console.WriteLine("It's 9:15 PM now.")).ToRunEvery(1).Days().At(21, 15); // 创建了一个叫"NonReentrant"的任务,在1秒后执行休眠1分钟,不重复(NonReentrant方法) Schedule(() => Sleep(TimeSpan.FromMinutes(1)).NonReentrant().WithName("NonReentrant").ToRunEvery(1).Seconds(); // 创建了一个叫“Reentrant”的任务,马上执行,且每隔1分钟就执行休眠3分钟的指令 Schedule(() => { Sleep(TimeSpan.FromMinutes(3)); }).WithName("Reentrant").ToRunNow().AndEvery(1).Minutes(); // 创建了一个叫“Disable”的任务,该任务200秒后执行一次 Schedule(() => { Sleep(TimeSpan.FromMinutes(3)); }).WithName("Disable").ToRunOnceIn(200).Seconds(); // 创建了一个叫“FiveMinutes”的任务,该任务在5分钟后开始执行,并且每个10分钟继续执行 Schedule(() => Sleep(TimeSpan.FromMinutes(3))).WithName("FiveMinutes").ToRunOnceAt(DateTime.Now.AddMinutes(5)).AndEvery(10).Minutes(); // 创建了一个叫“Weeks”的任务,每周执行一次 Schedule(() => Sleep(TimeSpan.FromMinutes(3))).WithName("Weeks").ToRunEvery(1).Weeks(); // 通过Weeks方法,依此类推还有 Weekdays()-每周工作日提醒 Days():每天提醒 Hours():每小时提醒 } } //主函数中调用 JobManager.Initialize(new MyRegistry());
-
自定义计划任务:通过继承IJob接口并实现Execute方法
//ParameterJob.cs //实现IJob接口 public class WriteLineJob : IJob { public string Parameter { get; set; } // 任务实际触发方法 public void Execute() => System.Console.WriteLine($"调入参数:{Parameter}"); } public class DisposableJob : IJob, IDisposable { // 任务实际触发方法 public void Execute() => Logger.Information("Disposable: executing"); // 销毁时触发的方法 public void Dispose() => Logger.Information("Disposable: disposed"); } // MyRegistry.cs // 将WriteLineJob加入到调度任务类中 // 直接new一个WriteLineJob并赋值,然后10s后调用 Schedule(new WriteLineJob{ Parameter = "Foo" }).WithName("Parameter").ToRunOnceIn(10).Seconds(); // 也是10s后运行,运行完成后会执行Dispose方法 Schedule<DisposableJob>().WithName("Disposable").ToRunOnceIn(10).Seconds();
-
-
事件监听
FluentScheduler支持三种事件,分别为任务开始,任务结束和任务异常
// 抛出异常时触发 // info为JobExceptionInfo类,Name:任务名称;Exception:触发的异常类 JobManager.JobException += info => System.Console.WriteLine($"异常信息:{info.Exception}"); // 任务开始时触发 // info为JobStartInfo类,Name:任务名称;StartTime:开始时间 JobManager.JobStart += info => System.Console.WriteLine($"任务{info.Name}开始执行"); // 任务完成后触发 // info为JobEndInfo类,Name:任务名称;StartTime:开始时间;NextRun:下次执行时间;Duration:该任务持续时间 JobManager.JobEnd += info => System.Console.WriteLine($"任务{info.Name}开始执结束,持续时间:{info.Duration}");