我们在实际工作中有一些需求是基于指定时间来运行某个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的配置以及基于脚本的设置。

1. 基于UI配置:

setup 搜索 Apex Class,右侧点击 Schedule Apex

Untitled

选择需要定期运行的类,配置好运行频率,设置当前job的开始以及截止日期以及这个job运行的时间

Untitled

2. 基于脚本运行

基于UI配置只能整点运行,而且针对 Frequency,特别复杂的设置无法实现,所以salesforce也提供了一个更加灵活的基于脚本运行job的方式,调用 System.schedule方法即可。这个方法有三个参数:

  1. Job Name:记录当前job的名称;
  2. Schedule详细信息:记录当前job具体的运行时间和频率;
  3. 当前类的实例化变量。

第二步的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点执行