应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

.NET CORE定时任务Quartz。控制台使用Quartz。在某个特定时间点执行定时任务。Cron表达式

8934人阅读 2021/3/21 11:06 总访问:5194595 评论:1 收藏:0 手机
分类: .NET Core

基本使用

下载依赖Quartz依赖:

  1. <ItemGroup>
  2. <PackageReference Include="Quartz" Version="3.3.3" />
  3. </ItemGroup>

创建任务类:输出一个系统时间就行比较简单

  1. public class TestJob : IJob
  2. {
  3. public Task Execute(IJobExecutionContext context)
  4. {
  5. return Task.Run(() =>
  6. {
  7. Console.WriteLine(DateTime.Now);
  8. });
  9. }
  10. }

使用控制台开始调度

  1. static void Main(string[] args)
  2. {
  3. StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
  4. IScheduler _scheduler = schedulerFactory.GetScheduler().Result;
  5. //创建触发器(也叫时间策略),每10秒执行一次,一直重复
  6. var trigger = TriggerBuilder.Create()
  7. .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).RepeatForever())
  8. .Build();
  9. //创建作业实例
  10. //TestJob即我们需要执行的作业
  11. var jobDetail = JobBuilder.Create<TestJob>()
  12. .WithIdentity("Test", "Group")//我们给这个作业取了个“Test”的名字,并取了个组名为“Group”
  13. .Build();
  14. //将触发器和作业任务绑定到调度器中
  15. _scheduler.ScheduleJob(jobDetail, trigger);
  16. //开启调度器
  17. _scheduler.Start();
  18. //注意这种方式编写不能让程序结束,不然控制台运行完程序直接就结束了,定时任务肯定看不到输出了。
  19. Console.ReadLine();
  20. }

输出如下:

如果只执行一次的话这样即可
WithRepeatCount设置为0

  1. var trigger = TriggerBuilder.Create()
  2. .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).WithRepeatCount(0))
  3. .Build();

一次性执行多个任务

  1. /// <summary>
  2. /// 定时服务入口
  3. /// </summary>
  4. /// <param name="args"></param>
  5. static void Main(string[] args)
  6. {
  7. StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
  8. Program program = new Program();
  9. //program.DoInitUserVisitCountDay(schedulerFactory);
  10. //program.DoArticleTitleToCacheJob(schedulerFactory);
  11. program.DoJobs(schedulerFactory);
  12. Console.ReadLine();
  13. }
  1. public void DoJobs(StdSchedulerFactory schedulerFactory)
  2. {
  3. Console.WriteLine("开始新的任务了,定义在每天0点2分执行................." + DateTime.Now);
  4. IScheduler _scheduler = schedulerFactory.GetScheduler().Result;
  5. var triggers = new ReadOnlyCollection<ITrigger>(
  6. new List<ITrigger>()
  7. {
  8. TriggerBuilder.Create()
  9. .WithCronSchedule("0/2 * * * * ?")
  10. .Build()
  11. });
  12. var trigger2 = new ReadOnlyCollection<ITrigger>(
  13. new List<ITrigger>()
  14. {
  15. TriggerBuilder.Create()
  16. .WithCronSchedule("0/2 * * * * ?")
  17. .Build()
  18. });
  19. // 创建作业实例
  20. var initUserVisitCountJob = JobBuilder.Create<InitUserVisitCountDay>()
  21. .WithIdentity("InitUserVisitCountDay", "Group")
  22. .Build();
  23. // 创建作业实例
  24. var articleTitleToCacheJob = JobBuilder.Create<ArticleTitleToCacheJob>()
  25. .WithIdentity("ArticleTitleToCacheJob", "Group")
  26. .Build();
  27. // 注意多个任务的triggers不能使用一个,不然经过测试触发不了
  28. var jobAndTriggerMapping = new Dictionary<IJobDetail, IReadOnlyCollection<ITrigger>>();
  29. jobAndTriggerMapping.Add(initUserVisitCountJob, triggers);
  30. jobAndTriggerMapping.Add(articleTitleToCacheJob, trigger2);
  31. var readOnlyjobAndTriggerMapping = new ReadOnlyDictionary<IJobDetail, IReadOnlyCollection<ITrigger>>(jobAndTriggerMapping);
  32. _scheduler.ScheduleJobs(readOnlyjobAndTriggerMapping, true);
  33. //开启调度器
  34. _scheduler.Start();
  35. }

更多时间策略

Quartz中有两种触发策略分别是:
Simple Trigger
CronTrigger

SimpleTrigger
可以满足的调度需求是:在具体的时间点执行一次,或者在具体的时间点执行,并且以指定的间隔重复执行,否者只执行具体的次数


每30秒执行一次,重复5次:

  1. var trigger = TriggerBuilder.Create()
  2. .WithSimpleSchedule(x => x.WithIntervalInSeconds(30).WithRepeatCount(5))
  3. .Build();


30分钟以后开始触发,仅执行一次

  1. var trigger = TriggerBuilder.Create()
  2. .WithSimpleSchedule()
  3. .StartAt(DateTimeOffset.Now.AddMinutes(30))
  4. .Build();


在22点过3分执行一次,只执行一次。注意这样设置,如果现在时间已经过了22点3分它任务这个定时的时候已经到了会马上执行,要想特定的时间点可以把年月日加上

  1. //在22点过3分执行一次,只执行一次
  2. var trigger = TriggerBuilder.Create()
  3. .WithSimpleSchedule()
  4. .StartAt(DateBuilder.DateOf(22, 3, 0))
  5. .Build();


在某个特定时间点执行定时任务,比如在2022-9-9早上8点执行一次,只执行一次

  1. //在2022-9-9早上8点执行一次,只执行一次
  2. var trigger = TriggerBuilder.Create()
  3. .StartAt(DateTimeOffset.Parse("2022-9-9 08:00:00"))
  4. .Build();


在整点8点执行一次,只执行一次。注意这样设置,如果现在时间已经过了22点3分它任务这个定时的时候已经到了会马上执行

  1. //在整点8点执行一次,只执行一次
  2. var trigger = TriggerBuilder.Create()
  3. .WithSimpleSchedule()
  4. .StartAt(DateBuilder.DateOf(08,0, 0))
  5. .Build();


立即触发,每个2小时执行一次,直到10:30:30

  1. var trigger = TriggerBuilder.Create()
  2. .WithSimpleSchedule(x => x.WithIntervalInHours(2).RepeatForever())
  3. .EndAt(DateBuilder.DateOf(10, 30, 30))
  4. .Build();


在下一个小时的整点触发,然后每1小时重复一次

  1. var trigger = TriggerBuilder.Create()
  2. .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever())
  3. .StartAt(DateBuilder.EvenHourDate(null))
  4. .Build();

CronTrigger

CronTrigger比SimpleTrigger更强大一点,可以基于日历的概念指定任务计划,稍后在介绍。
或者搜索一下Cron表达式生成器就有基本可以涵盖所有场景

每天上午10:42触发

  1. var trigger = TriggerBuilder.Create()
  2. .WithCronSchedule("0 42 10 * * ?")
  3. .Build();
  4. //创建作业实例
  5. var jobDetail = JobBuilder.Create<InitUserVisitCountDay>()
  6. .WithIdentity("InitUserVisitCountDay", "Group")
  7. .Build();
  8. //将触发器和作业任务绑定到调度器中
  9. _scheduler.ScheduleJob(jobDetail, trigger);
  10. //开启调度器
  11. _scheduler.Start();

每天凌晨12点30分执行一次

  1. //每天凌晨12点30分执行一次:
  2. var trigger = TriggerBuilder.Create()
  3. .WithCronSchedule("0 30 0 * * ?")
  4. .Build();

每天凌晨12点5分执行一次

  1. //
  2. 每天凌晨125分执行一次:
  3. var trigger = TriggerBuilder.Create()
  4. .WithCronSchedule("0 5 0 * * ?")
  5. .Build();

表达式解释

这些星号由左到右按顺序代表 :[秒] [分] [小时] [日] [月] [周] [年]
通配符
*: 表示所有值. 例如:在分的字段上设置 “”,表示每一分钟都会触发。
?: 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的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”前只能设置具体的数字,不允许区间”-“).
小提示
LW可以一组合使用。如果在日字段上设置LW,则表示在本月的最后一个工作日触发(一般指发工资 )

常用示例:

  1. 每天凌晨2 0 0 2 * * ?和每天隔一小时 0 * */1 * * ?
  2. 1:每隔5秒执行一次:*/5 * * * * ?
  3. 2:每隔5分执行一次:0 */5 * * * ?
  4. 26分、29分、33分执行一次:0 26,29,33 * * * ?
  5. 3:每天半夜1230分执行一次:0 30 0 * * ? (注意日期域为0不是24
  6. 每天凌晨1点执行一次:0 0 1 * * ?
  7. 每天上午1015执行一次: 0 15 10 ? * * 0 15 10 * * ? 0 15 10 * * ? *
  8. 每天中午十二点执行一次:0 0 12 * * ?
  9. 每天14点到1459分,每1分钟执行一次:0 * 14 * * ?
  10. 每天14点到1405分,每1分钟执行一次:0 0-5 14 * * ?
  11. 每天14点到1455分,每5分钟执行一次:0 0/5 14 * * ?
  12. 每天14点到1455分,和18点到1855分,每5分钟执行一次:0 0/5 14,18 * * ?
  13. 每天18点执行一次:0 0 18 * * ?
  14. 每天18点、22点执行一次:0 0 18,22 * * ?
  15. 每天7点到23点,每整点执行一次:0 0 7-23 * * ?
  16. 每个整点执行一次:0 0 0/1 * * ?

常用示例2:

  1. 常用示例:
  2. 0 0 12 * * ? 每天12点触发
  3. 0 15 10 ? * * 每天1015分触发
  4. 0 15 10 * * ? 每天1015分触发
  5. 0 15 10 * * ? * 每天1015分触发
  6. 0 15 10 * * ? 2005 2005年每天1015分触发
  7. 0 * 14 * * ? 每天下午的 2点到259分每分触发
  8. 0 0/5 14 * * ? 每天下午的 2点到259分(整点开始,每隔5分触发)
  9. 0 0/5 14,18 * * ? 每天下午的 2点到259分(整点开始,每隔5分触发)
  10. 每天下午的 18点到1859分(整点开始,每隔5分触发)
  11. 0 0-5 14 * * ? 每天下午的 2点到205分每分触发
  12. 0 10,44 14 ? 3 WED 3月分每周三下午的 210分和244分触发 (特殊情况,在一个时间设置里,执行两次或 两次以上的情况)
  13. 0 59 2 ? * FRI 每周5凌晨259分触发;
  14. 0 15 10 ? * MON-FRI 从周一到周五每天上午的1015分触发
  15. 0 15 10 15 * ? 每月15号上午1015分触发
  16. 0 15 10 L * ? 每月最后一天的1015分触发
  17. 0 15 10 ? * 6L 每月最后一周的星期五的1015分触发
  18. 0 15 10 ? * 6L 2002-2005 2002年到2005年每月最后一周的星期五的1015分触发
  19. 0 15 10 ? * 6#3 每月的第三周的星期五开始触发
  20. 0 0 12 1/5 * ? 每月的第一个中午开始每隔5天触发一次
  21. 0 11 11 11 11 ? 每年的1111 1111分触发(光棍节)

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

Session

2022/6/16 9:19:18

工作中正好用到定时器

[嘻嘻]

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

.net core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...

net core中使用cookie

net core中可以使用传统的cookie也可以使用加密的cookieNET CORE中使用传统cookie设置:HttpContext.Response.Cookies.Appe...

net core项目结构简单分析

一:wwwrootwwwroot用于存放网站的静态资源,例如css,js,图片与相关的前端插件等lib主要是第三方的插件,例如微软默认引用...

net core使用EF之DB First

一.新建一个.net core的MVC项目新建好项目后,不能像以前一样直接在新建项中添加ef了,需要用命令在添加ef的依赖二.使用Nug...

.net core使用requestresponse下载文件下载excel等

使用request获取内容net core中request没有直接的索引方法,需要点里边的Query,或者formstringbase64=Request.Form[&quot;f...

iframe自适应高度与配合net core使用

去掉iframe边框frameborder=&quot;0&quot;去掉滚动条scrolling=&quot;no&quot;iframe 自适应高度如果内容是固定的,那么就...

net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified

这是因为net core2.1默认使用的https,如果使用Kestrel web服务器的话没有安装证书就会报这个错其实仔细看他的错误提示,其...

net core中使用url编码与解码操作

net core中暂时还没有以前asp.net与mvc中的server对象。获取url的编码与解码操作不能使用以前的server对象来获取。使用的是...

下载net core

官方下载地址:https://dotnet.microsoft.com/download 进来之后就可以看到最新的下载版本可以直接点击下载,也可以下载其...

net core使用依赖注入来装载EF的上下文对象

妹子情人节快乐~.net core中用了不少的依赖注入,官方文档中也推荐使用。这样使用依赖注入来管理ef对象,还是比较科学,比如...