定时调度任务QuartZ框架
- 安装Nuget包
- 例子:
- 输出效果:
- 由输出结果可知,任务类是没执行一次都会构造一次。这说明这个类是无状态的。假如想让它有状态,即第一次执行的结果要传给第二次,可以这样做
- 添加类关键字PersistJobDataAfterExecution,并在调用context.JobDetail.JobDataMap.Put方法更新
<PersistJobDataAfterExecution()>
Public Class SendMessageJob
Implements IJob
Sub New()
Console.WriteLine("执行了一次SendMessageJob构造函数")
End Sub
Public Async Function Execute(context As IJobExecutionContext) As Task Implements IJob.Execute
Await Task.Run(Sub()
'获取传递过来的参数
Dim NameS As String = context.JobDetail.JobDataMap.GetString("name")
Dim ageS As String = context.JobDetail.JobDataMap.GetString("age")
Dim SexS As String = context.Trigger.JobDataMap.GetString("sex")
'假如有一样的,可以调用以下函数,它会取最后一个
' context.MergedJobDataMap.GetString("sex")
'更新结果,可以传递给下次使用
context.JobDetail.JobDataMap.Put("age", (CInt(ageS) + 1).ToString)
Console.WriteLine(NameS & ":" & ageS & ":" & SexS)
End Sub)
End Function
End Class
- 效果:
- 假如设置1秒执行一次任务,但是任务执行一次任务需要20秒,这样就会有任务出现重叠。可以设置类关键字<DisallowConcurrentExecution()>,标志只能执行完第一次任务才能进行下一次任务
- 上面是通过WithSimpleSchedule这个来指定时间策略的,来表示间隔多长时间执行任务
'3、指定时间策略
Dim trigger As ITrigger = TriggerBuilder.Create.
WithIdentity("sendTriger", "group1").
StartNow.'StartAt(New DateTimeOffset()).指定从某一时间点再开始
WithSimpleSchedule(Sub(ByVal w As SimpleScheduleBuilder)
'间隔一毫秒,重复4次,可使用.RepeatForever()永久重复
w.WithIntervalInSeconds(1).WithRepeatCount(4)
End Sub).
Build()
- 下面介绍另外一种cron方法定制时间策略,更加灵活。可以指定某月某日某一时刻触发,也可以指定每个月的某个时间循环触发
- 例子:
Dim trigger As ITrigger = TriggerBuilder.Create.
WithIdentity("sendTriger", "group1").
StartNow.'StartAt(New DateTimeOffset()).指定从某一时间点再开始
WithCronSchedule("20/1 * * * * ?").'表示每分钟,前20秒不执行,20到60秒,每隔一秒执行一次
Build()
- WithCronSchedule("0 15 9 * * ? ")'表示每天9点15执行一次,规律看最后附录
附录:
示例:"0 15 9 * * ? " 每天 9:15点
通配符说明:
* 表示所有值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。
? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的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"前只能设置具体的数字,不允许区间"-").