课程章节介绍
同学们,今天我们来聊聊怎么在 Salesforce 里提交和处理大批量的数据。你想想,如果要更新上百万条记录,一次全做肯定超时,这时候就需要一个“分批作业”的机制,叫做 Batch Apex。
咱们就从一个核心方法讲起,它叫 `Database.executeBatch`。注意啊,有些文档里可能误写成“executePoker”,那是笔误,正式名字是 `executeBatch`。这个方法就是用来启动一个批处理作业的。你调用它时,它会返回一个作业 ID,类型是 `AsyncApexJob ID`。有了这个 ID,你就可以随时监控作业的进度,比如查查处理了多少条、有没有失败。
这个 `executeBatch` 方法还可以带第二个参数,叫 ,作用域参数,。它控制着每一批要处理多少条记录。默认可能是 200,但你可以调,比如有些应用像 Creditum 这个对象,你最多能设到 2,000 条。为什么要有这个限制?因为每批的执行时间不能超过两分钟,设置合理的大小能避免超时。
那批作业提交之后去哪里了呢?它会进入一个叫 ,Apex Flex 队列, 的地方。这个队列最多可以放 100 个处于“等待”状态的作业。这就好比拿号排队,如果有人插队怎么办?别担心,你可以手动重新排序,用 Salesforce 的设置界面,或者用 `System.FlexQueue` 这个类提供的几个方法,把重要的作业往前挪。默认情况下,队列是按先进先出的顺序执行的,也就是先排队的先处理。
但是,队列里排队的作业再多,Salesforce 同一时间最多只能处理 5 个批作业并发运行。所以,即使你排了 50 个,也只有前 5 个在跑,其他的在等待。
好,接下来是批作业内部的状态保持。你可能会想,我能不能在批处理的过程中累加一个变量,比如统计总共成功的记录数?当然可以,但你需要让这个批处理类实现 `Database.Stateful` 接口。这个接口的作用是告诉系统:“我的实例变量在批次之间不要重置”。注意了,如果不实现 `Stateful`,每次执行下一个批次时,你的实例变量都会被清空,而静态变量更不用说了,它们永远都会被重置。所以如果你想在多个批次间计数或者汇总数据,记着一定加上 `implements Database.Stateful`。
最后,如果你想在未来的某个时间点自动运行一次批处理,而不是马上运行,你可以用 `System.scheduleBatch` 方法。它跟可调度的 Apex 不同,你不需要实现 `Schedulable` 接口,直接调用这个方法,指定批处理类和作业名,再给一个时间表达式,它就会在那个时间启动一次批处理,跑完就结束。
总结一下,今天我们学了怎么提交批处理:用 `executeBatch` 返回 ID 监控,设置作用域大小,理解 Flex 队列的容量和顺序,实现 `Stateful` 来保存状态,以及用 `scheduleBatch` 安排未来作业。这些就是批处理作业最核心的知识点,下节课我们接着看怎么处理错误和用测试方法来验证它们。
关键词
Apex
Salesforce
Developer Guide