我们在实际工作中有一些需求是基于指定时间来运行某个apex class逻辑,这种场景就需要用到 Schedule Apex,在apex中,只需要实现 Schedulable然后实现封装的方法就好,我们直接看例子。
下方的demo中,实现了 Schedulable接口,然后重写了 execute方法。方法体为上篇的batch调用,从而实现大数据量数据的定时操作的功能。
global class RefreshAccountSchedule implements Schedulable {
global void execute(SchedulableContext sc) {
RefreshAccountBatch accountBatch = new RefreshAccountBatch();
Database.executeBatch(accountBatch,10);
}
}
针对 Schedule Apex的调用,salesforce提供了两种方式。基于UI的配置以及基于脚本的设置。
setup 搜索 Apex Class,右侧点击 Schedule Apex
选择需要定期运行的类,配置好运行频率,设置当前job的开始以及截止日期以及这个job运行的时间
基于UI配置只能整点运行,而且针对 Frequency,特别复杂的设置无法实现,所以salesforce也提供了一个更加灵活的基于脚本运行job的方式,调用 System.schedule方法即可。这个方法有三个参数:
第二步的Schedule的执行时间字符串通过空格分隔每个时间点,时间点的顺序为:
Seconds Minutes Hours Day_of_month Month Day_of_week optional_year
每个时间点的取值如下所示:
名称 | 取值范围 | 特殊字符 | |
---|---|---|---|
Seconds | 0-59 | NONE | |
Minutes | 0-59 | NONE | |
Hours | 23 | , - * / | |
Day_of_month | 1--31 | , - * / ? L W | |
Month | 1--12或者JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC | , - * / | |
Day_of_week | 1--7或者SUN,MON,TUE,WED,THU,FRI,SAT | , - * / ? L # | |
optional_year | null或者1970--2099 | , - * / |
特殊字符包含八种,下面是对他们的解释:
特殊字符名称 | 特殊字符解释 |
---|---|
, | 定界值。比如Hours设置1,2则只有小时为1或者2的时候执行 |
- | 指定一个范围。比如Day_of_week设置2-6则周一到周五执行 |
* | 指定所有值。比如Day_of_month指定*则每天都执行 |
? | 没有指定特定的值,只在Day_of_month和Day_of_week中执行 |
/ | /左侧指定间隔什么时间开始,/右侧显示间隔数量。eg:对于Day_of_month,指定1/5则每个月的每个第五天开始运行第一天 |
L | 只应用于Day_of_month以及Day_of_week.用于Day_of_month代表当月最后一天,用于Day_of_week,代表每月最后一个周几. eg : 1L代表每月最后一个周日 |
W | 只应用于Day_of_month.指定最接近与当天的工作日,比如指定20W,20为周六,则值为19,即星期五。如果指定1W,1为周六,最接近的为上个月,则不可取,取第三日,即周一。 |
# | 只应用于Day_of_week.格式为weekday#day_of_month。其中,#以前代表工作日1-7(周日-周六),#以后指定月的第几天。eg:2#2代表每个月第二个周一执行。 |
通过几个例子举例:
0 0 13 * * ? 指定每天13点执行
0 0 22 ? * 6L 指定每个月最后一个周五22点执行