Quartz.NET(作业调度框架) 学习笔记(三)【Cron 表达式】

有这么几个问题?

1,  每天的2点到6点之间每15分钟对服务器上某个文件夹进行搜索

2,  每周的周5的8点45分对数据库进行备份

3,  每月的最后一天8点创建销售报表

4,  我要在,每个月的15号左右给用户发送邮件,如果是15号是节假日。那么等都来上班的时候在发送。

5,  我要在每个月的第三个周的周5,给每个员工发邮件通知聚餐。

 

像这样复杂的计划,我们怎么办呢,那么CronTrigger触发器就能为我准确的计划

 

先说说CronTrigger触发器的用法

cron 这一观念是来自于 UNIX 世界。在 UNIX 中,cron 是一个运行于后台的守护程序,它负责所有基于时间的事件。尽管 Quartz 除相同的名字和相似的表达式语法外,并未分享到 UNIX cron 别的东西,我们还是值得花几个段落去理解 cron 背后的历史。我们这里的目标不是搞混 UNIX cron 表达式和 Quartz 的 cron 表达式,但是你应该了解 Quartz 表达式的历史,并探索为什么他们运作起来很像

首先说说CronTrigger控制时间的7个域

分,秒,时,天,月,周,年

 

Cron Expression 的格式

比如说第一个问题,每天的2点到6点之间每15分钟对服务器上某个文件夹进行搜索?

对服务器上某个文件夹进行搜索 这是Job所做的事,我们如何来控制Job的执行呢

看看Cron表达式

0  0,15,30,45  2,3,4,5,6  ?  *  *  *

这个在0,15,30,45分域,说明代表在时间分上的执行控制。

“,”: 时间列表之间用

“*”:在分域,月域,周域,年域 代表每天,每月,每周,每年,也就代表任何

“?”:这是一个消除矛盾的符号,解释一下“?“ 因为如果指定了日,在指定周的话,就变的不清楚,不知道是到周几执行 还是那一天执行。所以日和周域,不能同时指定值,又不能为空,只能用?代表其中之一 ?代表不指定值

当然上面的这个表达式可以精简

0  0/15  2-6  ?  *  *

0/15 表示分域 以15分递增 和0,15,30,45是一样的效果

2-6 表示时域从2点到6点每小时执行,就是代表一个区段

在这里没有给年域指定,是因为年域可以为空,其它域都不可以

注:这个表达式执行顺序:2:15 00, 2:30 00,  2:45 00,3:00 00 秒域是0 所以在整分执行 如果秒域我改成15  就变成  2:15 15,2:30 15 ,2:45 15 3:00 15 这样的执

 

看第二个问题

每周的周5的8点45分对数据库进行备份?

当然备份还是Job的工作,Corn表达式只是控制Job的

这个问题Cron表达式

*  45  8  ?  *  6  *

解释一下

“6”在周域上,不代表周六,而代表周5 这个你懂的,当然还可以用English的FRI

看第三个问题

每月的最后一天创建销售报表?

创建销售报表 当然还是Job的工作了

这个问题Cron表达式

0 0 8 L * ?

解释一下

“L” 说明了某域上允许的最后一个值。它仅被日和周域支持。当用在日域上,表示的是在月域上指定的月份的最后一天。

“L” 用在周域上表示周的最后一天 星期6 注意不是星期日

在这表示 每月的最后一天 因为月域上是“*”

0         30  8  ?  *  L  表示每个月的最后一个周六早上8点30执行

在看第四个问题

我要在,每个月的15号左右给用户发送邮件,如果是15号是节假日。那么等都来上班的时候在发送?

发邮件,不用解释你懂的,该什么负责

这里有就有了平日的概念,除了周末和法定假日都是平日

题目要求在节假日的不发送,那么Cron表达式很好啊,刚好有这个一个表达式来支持它

看看:*  *  *  15W  *  ?

解释一下:

“W” 字符代表着平日 (Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日。大部分的商业处理都是基于工作周的,所以 W 字符可能是非常重要的。例如,日域中的 15W 意味着 "离该月15号的最近一个平日。" 假如15号是星期六,那么 trigger 会在14号(星期四)触发,因为距15号最近的是星期四

最后一个问题

我要在每个月的第三个周的周5,给每个员工发邮件通知聚餐?

这个很简单,我只是为了说明最后一个符号 “#”

表达式:*  *  * ?  *  6#3

在解释一下

秒域是“*” 所以这个域合法的值 秒域合法的值 你懂的 0-59

分域是“*” 同上 你懂的

时域是 “*” 同上 你懂的

天域“?” 是因为周域有值,避免冲突的

月域“*” 你懂的

周域“6#3” 表示第三周的星期5 (注:6代表周五)

年域空,在所有域中只有年域可以为空。

 

注: 所有域和域之间是用空格隔开。

有了这么多表达式,你想控制JOB 应该很简了。

 

 要试验的话,拿 学习笔记(二)的代码将

 Trigger trigger = TriggerUtils.MakeSecondlyTrigger(2);

改为

CronTrigger trigger = new CronTrigger(“Cron Expression ”);

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Quartz.NET是一个开源的作业调度框架,它可以帮助我们实现定时任务和作业调度。在Quartz.NET中,我们可以通过实现IJob接口来定义一个作业,并且可以通过JobDataMap来传递参数。这篇文章将介绍如何在Quartz.NET中使用IJobExecutionContext来传递参数。 在Quartz.NET中,每次执行一个作业,都会创建一个新的JobExecutionContext对象。这个对象包含了当前作业的执行环境信息,包括作业的JobDetail信息、Trigger信息、Scheduler信息等等。除此之外,JobExecutionContext还提供了一个JobDataMap对象,用于存储传递给作业的参数。 下面是一个简单的示例,演示了如何在作业中获取JobDataMap中的值: ```csharp public class MyJob : IJob { public void Execute(IJobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; string param1 = dataMap.GetString("param1"); int param2 = dataMap.GetInt("param2"); // 使用传递的参数执行作业逻辑 // ... } } ``` 在这个示例中,我们定义了一个作业MyJob,并实现了IJob接口。在Execute方法中,我们通过JobExecutionContext对象获取了JobDataMap,并从中获取了传递给作业的参数。接下来,我们可以使用这些参数执行作业逻辑。 除了JobDataMap之外,JobExecutionContext还提供了许多其他有用的信息,例如当前作业的执行时间、上次执行时间、下次执行时间等等。我们可以根据这些信息来编写更加复杂的作业逻辑。 总之,使用IJobExecutionContext可以方便地在Quartz.NET中传递参数,并且获取作业的执行环境信息。如果你想了解更多关于Quartz.NET的内容,可以参考Quartz.NET官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值