定时任务
定时任务
在实际项目开发中 Web 应用有一类不可缺少的,那就是定时任务。 定时任务的场景可以说非常广泛,比如在保证最终一致性的场景中,往往利用定时任务调度进行一些比对工作;比如一些定时需要生成的报表、邮件;比如一些需要定时清理数据的任务等。 所以我们提供方便友好的 web 界面,实现动态管理任务,可以达到动态控制定时任务启动、暂停、重启、删除、添加、修改等操作,极大地方便了开发过程。
新建任务
前端打开菜单(系统监控 -> 定时任务)
- 任务类型:选择一种任务类型(程序集、api、sql 语句)这里以
程序集
为例 - 触发器类型:选择
表达式
- 任务名称:自定义,如:定时查询任务状态
- 任务分组:根据字典
sys_job_group
配置 - 程序集名称:这里用默认
ZR.Tasks
- 任务类名:和程序集名称配套使用,任何类名里面的方法名
TaskScheduler.Job_SyncTest
- 执行表达式:可查询
cron
官方表达式介绍 - 备注:定时任务描述信息
创建完之后找到刚刚创建的任务,点击 更多 -> 启动 -> 执行一次,测试定时任务是否正常及调度日志是否正确记录,如正常执行表示任务配置成功。
提示
默认创建任何后是关闭状态、需要点击 更多 -> 启动 只有启动的任何才有 运行一次
cron 表达式语法: [秒] [分] [小时] [日] [月] [周] [年]
名称 | 必填 | 还允许填写的值 | 允许的通配符 |
---|---|---|---|
秒 | 是 | 0-59 | , - * / |
分 | 是 | 0-59 | , - * / |
时 | 是 | 0-23 | , - * / |
日 | 是 | 1-31 | , - * / |
月 | 是 | 1-12 | , - * ? / L W |
周 | 是 | 1-7 | , - * ? / L # |
年 | 是 | 1970-2099 | , - * / |
通配符说明:
*
表示所有值。 例如:在分的字段上设置*,表示每一分钟都会触发?
表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的 10 号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为”?” 具体设置为 0 0 0 10 * ?-
表示区间。例如 在小时上设置 “10-12”,表示 10,11,12 点都会触发,
表示指定多个值,例如在周字段上设置 “MON,WED,FRI” 表示周一,周三和周五触发/
用于递增触发。如在秒上面设置”5/15” 表示从 5 秒开始,每增 15 秒触发(5,20,35,50)。 在月字段上设置’1/3’所示每月 1 号开始,每隔三天触发一次L
表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于”7”或”SAT”。如果在”L”前加上数字,则表示该数据的最后一个。例如在周字段上设置”6L”这样的格式,则表示“本月最后一个星期五”W
表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上置”15W”,表示离每月 15 号最近的那个工作日触发。如果 15 号正好是周六,则找最近的周五(14 号)触发, 如果 15 号是周未,则找最近的下周一(16 号)触发.如果 15 号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 “1W”,它则表示每月 1 号往后最近的工作日触发。如果 1 号正是周六,则将在 3 号下周一触发。(注,”W”前只能设置具体的数字,不允许区间”-“)#
序号(表示每月的第几个周几),例如在周字段上设置”6#3”表示在每月的第三个周六.注意如果指定”#5”,正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了) ;小提示:’L’和 ‘W’可以一组合使用。如果在日字段上设置”LW”,则表示在本月的最后一个工作日触发;周字段的设置,若使用英文字母是不区分大小写的,即 MON 与 mon 相同
任务类型
程序集任务
所有程序集任务存放在ZR.Tasks.TaskScheduler
里面
- 创建一个程序集
using Infrastructure.Attribute;
using Quartz;
using System.Threading.Tasks;
namespace ZR.Tasks.TaskScheduler
{
/// <summary>
/// 定时任务测试
/// 使用如下注册后TaskExtensions里面不用再注册了
/// </summary>
[AppService(ServiceType = typeof(Job_SyncTest), ServiceLifetime = LifeTime.Scoped)]
public class Job_SyncTest : JobBase, IJob
{
//private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public async Task Execute(IJobExecutionContext context)
{
await ExecuteJob(context, async () => await Run());
}
public async Task Run()
{
await Task.Delay(1);
//TODO 业务逻辑
System.Console.WriteLine("job test");
}
}
}
注册服务
在
ZR.Admin.WebApi.Extensions.TasksExtension
方法AddTaskSchedulers
中加入以下代码services.AddTransient<Job_SyncTest>();
后台创建定时任务
api 任务(推荐)
任务类型选择 执行url
支持 get
和 post
请求
apiUrl 里面填写要执行的地址,比如:http://localhost:8888/home/xxxx
请求参数
GET 类型请求格式:token=abc&name=xxxx
POST 类型请求格式:{ token: abc, name: xxx}
sql 任务
任务类型选择 执行sql语句
,SQL 语句填写具体要执行的 sql 语句
例子:
use zradmin;
select getdate();
注意
定时任务在开发环境中是默认不启用的,为了防止在开发中,和线上的环境中重复执行任务。具体代码在 program.cs
中