定时调度任务QuartZ框架

  1. 安装Nuget包

  1. 例子:

  2. 输出效果:

  3. 由输出结果可知,任务类是没执行一次都会构造一次。这说明这个类是无状态的。假如想让它有状态,即第一次执行的结果要传给第二次,可以这样做
    1. 添加类关键字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

    2. 效果:

  4. 假如设置1秒执行一次任务,但是任务执行一次任务需要20秒,这样就会有任务出现重叠。可以设置类关键字<DisallowConcurrentExecution()>,标志只能执行完第一次任务才能进行下一次任务

  5. 上面是通过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()

  6. 下面介绍另外一种cron方法定制时间策略,更加灵活。可以指定某月某日某一时刻触发,也可以指定每个月的某个时间循环触发
  7. 例子:

Dim trigger As ITrigger = TriggerBuilder.Create.

WithIdentity("sendTriger", "group1").

StartNow.'StartAt(New DateTimeOffset()).指定从某一时间点再开始

WithCronSchedule("20/1 * * * * ?").'表示每分钟,前20秒不执行,20到60秒,每隔一秒执行一次

Build()

  1. WithCronSchedule("0 15 9 * * ? ")'表示每天9点15执行一次,规律看最后附录
  2.  
  3.  
  4.  

 

 

 

 

 

 

 

 

 

 

 

 

 

附录:

示例:"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"前只能设置具体的数字,不允许区间"-").

 

 

 

posted @ 2022-04-30 19:05  ihh2021  阅读(230)  评论(0编辑  收藏  举报