Quartz.NET 是一个功能齐全的开源做业调度系统,可用于从最小的应用程序到大型企业系统。html
Quartz.NET是纯净的,它是一个.Net程序集,是很是流行的Java做业调度系统Quartz的C#实现。web
Quartz.NET不少特征,如:数据库支持,集群,插件,支持cron-like表达式等等,很是适合在平时的工做中,定时轮询数据库同步,定时邮件通知,定时处理数据等。数据库
Quartz.NET容许开发人员根据时间间隔(或天)来调度做业。它实现了做业和触发器的多对多关系,还能把多个做业与不一样的触发器关联。服务器
Quartz.NET的应用程序能够重用来自不一样事件的做业,还能够为一个事件组合多个做业。架构
我这次选择Quartz.Net使用的版本是 3.3.3app
这里强调一点:3.x的版本与2.x的版本使用方式有必定的差异ui
Quartz.NET官方文档:https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html.net
public class RegularWork : IJob { private readonly I_RegularWork_BLL I_bll; public RegularWork(I_RegularWork_BLL Ibll) { I_bll = Ibll; } public Task Execute(IJobExecutionContext context) { Input_RoomType model = new Input_RoomType(); model.currentPage = 1; model.pageSize = 1; var result = I_bll.getRoomTypeList(model); return Task.Run(() => { using (StreamWriter sw = new StreamWriter(@"F:/Quartz-NET.txt", true, Encoding.UTF8)) { sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff =>") + JsonConvert.SerializeObject(result)); } }); } }
//Quartz的工做单元 services.AddTransient<RegularWork>();
从 Quartz.NET 3.3.2 开始,默认做业工厂生成的全部做业都是做用域做业,不该再使用UseMicrosoftDependencyInjectionScopedJobFactory。插件
AddJob-新增一个工做单元;StartNow表示做业如今就开始执行;code
WithInterval用于执行时间策略执行规则;
TimeSpan.FromSeconds表示执行的时间间隔,秒为单位;RepeatForever表明重复工做,能够用WithRepeatCount(5)代替RepeatForever;WithRepeatCount(5)表明执行5次
//Quartz调度中心 services.AddQuartz(q => { //用于注入 q.UseMicrosoftDependencyInjectionJobFactory(); // 基本Quartz调度器、做业和触发器配置 var jobKey = new JobKey("RegularWork", "regularWorkGroup"); q.AddJob<RegularWork>(jobKey, j => j .WithDescription("My regular work") ); q.AddTrigger(t => t .WithIdentity("Trigger") .ForJob(jobKey) .StartNow() .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(10))//开始秒数 10s .RepeatForever())//持续工做 .WithDescription("My regular work trigger") ); });
// ASP.NET核心托管-添加Quartz服务器 services.AddQuartzServer(options => { // 关闭时,咱们但愿做业正常完成 options.WaitForJobsToComplete = false; });
完整代码以下
//Quartz的工做单元 services.AddTransient(); //Quartz调度中心 services.AddQuartz(q => { //用于注入 q.UseMicrosoftDependencyInjectionJobFactory(); // 基本Quartz调度器、做业和触发器配置 var jobKey = new JobKey("RegularWork", "regularWorkGroup"); q.AddJob }); // ASP.NET核心托管-添加Quartz服务 services.AddQuartzServer(options => { // 关闭时,咱们但愿做业正常完成 options.WaitForJobsToComplete = false; });(jobKey, j => j .WithDescription("My regular work") ); q.AddTrigger(t => t .WithIdentity("Trigger") .ForJob(jobKey) .StartNow() .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(10))//开始秒数 10s .WithRepeatCount(5))//持续工做 .WithDescription("My regular work trigger") );
这时候咱们启动项目,按期工做开始执行。这时候的注入是有效的,查询数据后结果打印在F盘下的Quartz-NET.txt文件内(以下图)。
官方的文档介绍:https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html#format
由7段构成:秒 分 时 日 月 星期 年(可选)
"-" :表示范围 MON-WED表示星期一到星期三
"," :表示列举 MON,WEB表示星期一和星期三
"*" :表是“每”,每个月,天天,每周,每一年等
"/" :表示增量:0/15(处于分钟段里面) 每15分钟,在0分之后开始,3/20 每20分钟,从3分钟之后开始
"?" :只能出如今日,星期段里面,表示不指定具体的值
"L" :只能出如今日,星期段里面,是Last的缩写,一个月的最后一天,一个星期的最后一天(星期六)
"W" :表示工做日,距离给定值最近的工做日
"#" :表示一个月的第几个星期几,例如:"6#3"表示每月的第三个星期五(1=SUN...6=FRI,7=SAT)
Expression | Meaning |
---|---|
0 0 12 * * ? | 天天中午12点触发 |
0 15 10 ? * * | 天天上午10:15触发 |
0 15 10 * * ? | 天天上午10:15触发 |
0 15 10 * * ? * | 天天上午10:15触发 |
0 15 10 * * ? 2005 | 2005年的天天上午10:15触发 |
0 * 14 * * ? | 在天天下午2点到下午2:59期间的每1分钟触发 |
0 0/5 14 * * ? | 在天天下午2点到下午2:55期间的每5分钟触发 |
0 0/5 14,18 * * ? | 在天天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 |
0 0-5 14 * * ? | 在天天下午2点到下午2:05期间的每1分钟触发 |
0 10,44 14 ? 3 WED | 每一年三月的星期三的下午2:10和2:44触发 |
0 15 10 ? * MON-FRI | 周一至周五的上午10:15触发 |
0 15 10 15 * ? | 每个月15日上午10:15触发 |
0 15 10 L * ? | 每个月最后一日的上午10:15触发 |
0 15 10 L-2 * ? | Fire at 10:15am on the 2nd-to-last last day of every month |
0 15 10 ? * 6L | 每个月的最后一个星期五上午10:15触发 |
0 15 10 ? * 6L | Fire at 10:15am on the last Friday of every month |
0 15 10 ? * 6L 2002-2005 | 2002年至2005年的每个月的最后一个星期五上午10:15触发 |
0 15 10 ? * 6#3 | 每个月的第三个星期五上午10:15触发 |
0 0 12 1/5 * ? | Fire at 12pm (noon) every 5 days every month, starting on the first day of the month. |
0 11 11 11 11 ? | Fire every November 11th at 11:11am. |