Salesforce Apex Scheduler

利用ApexSchedulable实现定时任务:执行、调度与监控,
本文介绍了如何在Apex中使用Schedulable接口创建定时任务,包括创建继承Schedulable的Apex类、设置执行时间和频率,以及如何在execute方法中执行操作。还讲解了如何监控Schedulable执行结果和使用batchApex进行批量处理。
Schedulable

对于想要在指定的时间执行的Apex,可以使用Schedulable接口。

比如:在每个月最后一天早上10点插入一条Account,name为'Schedulable Account 2024-**-**'。

首先,创建一个Apex类InsertAccountSchedule继承Schedulable接口,并在execute方法中实现插入Account。

global class InsertAccountSchedule implements Schedulable {
   global void execute(SchedulableContext SC) {
     Account M = new Account(); 
     M.name = 'Schedulable Account ' + System.today();
     insert M;
   }
}
  • Schedulable接口中包含一个必须实现的方法execute,并必须被声明为global或public。 
 执行Schedulable

Schedulable Apex准备好之后需要执行,可以在环境中手动设定执行,也可以使用System.schedule(jobName, cronExpression, schedulableClass)方法来执行。

1.手动设定

Set up → Apex → Apexをスケジュール 

将执行时间设置为每月最后一天的上午10点。 

2.System.schedule(jobName, cronExpression, schedulableClass)

InsertAccountSchedule m = new InsertAccountSchedule();
String sch = '0 0 10 L */1 ?';
String jobID = System.schedule('Job01' + system.now(), sch, m);

在开发者console中执行上面的代码就可以实现每月最后一天上午10点插入一条Account。执行后,job会出现在环境中。 

  •  环境中最多同时有100个scheduled Apex jobs。

说回执行方法System.schedule,方法中有3个参数:第一个是job的name,第二个是用于表示计划执行的时间和日期的表达式,第三个是要执行的schedulable apex。下面详细说说第二个参数。

表达式语法:

String sch = 'Seconds Minutes Hours Day_of_month Month Day_of_week Optional_year';
Name值范围特殊字符
Seconds0–59
Minutes0–59
Hours0–23, - * /
Day_of_month1–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_yearnull 或1970–2099, - * /

特殊字符的含义:

特殊字符说明例子
,

指定多个时间,和and类似。

0 0 12 ? * 2,4,6 

每周一、周三、周五中午12时

-

指定范围,和from...to...类似。

0 0 8-14 ? * 1 

每周周日8时到14时每小时一次

*

指定取值范围内的所有值,相当于every。

0 0 12 * * * 

每天中午12时

?

不指定具体值,相当于any。

只能用于Day_of_month和Day_of_week,当这两个有一个被指定时,另外一个要使用“?”

0 0 12 1 * ?

每个月1号的12时 (无论1号是本周的哪一天)

/

指定增量,“/”前面是开始时间,“/”后面是间隔。

0 0 3/6 * * * 

每天早上3点开始,每6小时执行一次

L

指定范围内的最后一个值,相当于Last。如在Day_of_month中使用L,则为该月最后一天;如在Day_of_week中使用L,则在该周最后一天(周六,周日是第一天周六是最后一天);如Day_of_week设为3L,job会在该月最后一个星期二执行。

0 0 12 L */1 ? 

每月最后一天中午12点

#

指定本月第几个周几,“#”前面是周几,“#”后面是第几个。

0 0 12 ? * 5#2 

每月第二个周四中午12点

W

指定本月中最近的工作日。

将Day_of_month设为20W,会在距离20号最近的一个工作日执行;若20号是工作日则在20号执行,若20号是周六则在19号执行。

将Day_of_month设为1W,即使该月1号是周六,也不会在前一个月执行,而是会在本月3号即下一个周一执行。

 监控结果

Schedulable被执行后返回值时CronTrigger表的Id,通过Id可以查到需要的信息。

CronTrigger ct = 
    [SELECT TimesTriggered, NextFireTime, PreviousFireTime, State
    FROM CronTrigger WHERE Id = :jobID];

 还可以在execute方法中执行sql,sql条件中使用的Id可以通过SchedulableContext的getTriggerId()方法来取得。

CronTrigger ct = 
    [SELECT TimesTriggered, NextFireTime
    FROM CronTrigger WHERE Id = :sc.getTriggerId()];

在环境中也可以对结果进行监控。

 在Schedulable中使用batch apex

使用System.scheduleBatch(new batch01(),  'job example', minutes)可以简单的在未来某一时间执行一次batch,如果想在特定时间多次执行,可以在schedulable中执行batch apex。

global class ScheduledBatchable implements Schedulable {
   global void execute(SchedulableContext sc) {
      Batchable b = new Batchable(); 
      Database.executeBatch(b);
   }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值