# TaskManagement **Repository Path**: jlk1912/TaskManagement ## Basic Information - **Project Name**: TaskManagement - **Description**: 基于Quartz开发的定时任务接口 - **Primary Language**: Unknown - **License**: AFL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-02-25 - **Last Updated**: 2022-05-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README --- 基于Quartz 与.net core WebAPI 的定时任务实现 --- # 1、概述 通过前端调用接口方法,实现前端对服务器任务的调度的控制。 # 2、功能设计 - 前端添加任务,保存数据库 - 后台支持时间点和时间段实现定时任务执行 - 通过前端控制任务的启动和关闭 # 3、技术路线 框架:.net core2.2 定时任务包:Quartz3.07 数据库:sqllite ORM:sqlsugar # 4、接口设计 作为乞丐版的接口至少完成以下接口 - 获取数据库任务列表 - 添加任务 - 通过任务编号启动任务 - 停止所有任务 # 5、数据库设计 | 字段 | 数据类型 | 描述 | | -------- | -------- | ------------------------ | | ID | number | 唯一标识 | | NAME | vachar | 任务名称 | | TYPE | vachar | 任务类型(ping;telnet) | | TIMESPAN | vachar | 时间间隔 | # 6、概念理解 需要理解三个概念 Job:需要定时去执行的方法,**我要做什么** Trigger:触发器,配置定时方案,**什么时候去做** Scheduler:任务调度中心 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0217/000403_b1630574_717356.png "屏幕截图.png") 再往上一级,一个任务对应多个Scheduler # 7、Quartz实现 ## 7.1 引入包 Install-Package Quartz ## 7.2 配置job 配置了一个名为PingJob和一个TelnetJob的任务 ```c# public class PingJob : IJob { public Task Execute(IJobExecutionContext context) { Console.WriteLine($"Ping的任务执行时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"); return Task.CompletedTask; } } ``` ```c# public class TelnetJob : IJob { public Task Execute(IJobExecutionContext context) { Console.WriteLine($"Telnet的任务执行时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"); return Task.CompletedTask; } } ``` ## 7.3 定时任务工具类 ```c# private static IScheduler _scheduler; /// /// 时间间隔 /// /// /// /// /// /// /// public static async Task StartAsync(TimeSpan ts, string jobName, string triggerName, string groupName) where T : IJob { DateTimeOffset runTime = DateBuilder.EvenSecondDate(DateTime.Now); IJobDetail job = JobBuilder.Create().WithIdentity(jobName, groupName).Build(); ITrigger trigger = TriggerBuilder.Create().WithIdentity(triggerName, groupName).StartAt(runTime).WithSimpleSchedule(x => x.WithInterval(ts).RepeatForever()).Build(); if (_scheduler ==null) { ISchedulerFactory factory = new StdSchedulerFactory(); _scheduler = await factory.GetScheduler(); } await _scheduler.ScheduleJob(job, trigger); await _scheduler.Start(); return _scheduler; } /// /// 时间点cron表达式 /// /// /// /// /// /// /// public static async Task StartAsync(string cronExp, string jobName, string triggerName, string groupName) where T : IJob { DateTimeOffset runTime = DateBuilder.EvenSecondDate(DateTime.Now); IJobDetail job = JobBuilder.Create().WithIdentity(jobName, groupName).Build(); ITrigger trigger = TriggerBuilder.Create().WithIdentity(triggerName, groupName).WithCronSchedule(cronExp).StartAt(runTime).Build(); if (_scheduler == null) { ISchedulerFactory factory = new StdSchedulerFactory(); _scheduler = await factory.GetScheduler(); } await _scheduler.ScheduleJob(job, trigger); await _scheduler.Start(); return _scheduler; } public static async Task StopAllTask() { await _scheduler.PauseAll(); } ``` 包括时间间隔、时间点、停止所有任务 从`_scheduler.ScheduleJob(job, trigger);`代码中可以看出 由`job`和`trigger`产生一个`ScheduleJob` # 8、数据库操作实现 略 # 9、控制器方法实现 通过使用**数据库操**作及**定时任务工具类**完成 # 10、结果预览 ## 10.1 添加任务 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0217/000432_882d6236_717356.png "1581867563016.png") ## 10.2 获取数据库中的任务列表 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0217/000449_516dd83e_717356.png "1581867606489.png") ## 10.3通过编号执行任务 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0217/000639_35e336fe_717356.png "1581867654420.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/0217/000654_94fb0c06_717356.png "1581867710460.png") # 13、参考 https://blog.csdn.net/xishining/article/details/89464722 https://www.skyfinder.cc/2019/12/16/quartz-net-execute-task/ https://andrewlock.net/creating-a-quartz-net-hosted-service-with-asp-net-core/ https://byteloom.marek-mierzwa.com/2017/04/13/scheduling-in-asp-net-core-with-quartz-net.html