# 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:任务调度中心

再往上一级,一个任务对应多个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 添加任务

## 10.2 获取数据库中的任务列表

## 10.3通过编号执行任务


# 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