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 | 值范围 | 特殊字符 |
|---|---|---|
| Seconds | 0–59 | 无 |
| Minutes | 0–59 | 无 |
| Hours | 0–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 | , - * / |
特殊字符的含义:
| 特殊字符 | 说明 | 例子 |
|---|---|---|
, |
指定多个时间,和and类似。 |
每周一、周三、周五中午12时 |
- |
指定范围,和from...to...类似。 |
每周周日8时到14时每小时一次 |
* |
指定取值范围内的所有值,相当于every。 |
每天中午12时 |
? |
不指定具体值,相当于any。 只能用于 |
每个月1号的12时 (无论1号是本周的哪一天) |
/ |
指定增量,“/”前面是开始时间,“/”后面是间隔。 |
每天早上3点开始,每6小时执行一次 |
L |
指定范围内的最后一个值,相当于Last。如在Day_of_month中使用L,则为该月最后一天;如在Day_of_week中使用L,则在该周最后一天(周六,周日是第一天周六是最后一天);如Day_of_week设为3L,job会在该月最后一个星期二执行。 |
每月最后一天中午12点 |
# |
指定本月第几个周几,“ |
每月第二个周四中午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);
}
}
利用ApexSchedulable实现定时任务:执行、调度与监控,
本文介绍了如何在Apex中使用Schedulable接口创建定时任务,包括创建继承Schedulable的Apex类、设置执行时间和频率,以及如何在execute方法中执行操作。还讲解了如何监控Schedulable执行结果和使用batchApex进行批量处理。
992






