Salesforce 异步概述 -- Salesforce Apex Batch Job
为什么使用Batch
开发人员现在可以使用批处理Apex来构建复杂的、长时间运行的进程,这些进程运行在Lightning上的数千条记录上平台。Batch Apex操作小批量的记录,覆盖您的整个记录集,并将处理分解成可管理的块。例如,开发人员可以构建一个每晚运行的归档解决方案,寻找超过特定日期的记录,并将它们添加到归档中。或者开发人员可以构建一个经过所有account和每天晚上都有机会,必要时及时更新
最多只能有五个排队或活动的batch job。您可以通过查看Salesforce中的Scheduled Jobs页面或通过编程方式使用SOAP API查询AsyncApexJob对象来计算当前的计数。
如何创建一个Batch class
实现 Database.Batchable 接口
例:
public class DataArchiveBatch implements Database.Batchable{}
同事类中需要包含三个方法
• start method:
public (Database.QueryLocator | Iterable) start(Database.BatchableContext bc) {}
这个方法返回一个Database.QueryLocator游标或包含传递给作业的记录或可迭代对象
Database.QueryLocator 会绕过系统对于SQL查询的限制,支持最多为5000万的数据返回一个查询游标,适合简单sql查询使用
• execute method:
• finish method:
可以在finish方法获取当前batch运行情况
AsyncApexJob a = [SELECT Id, Status, NumberOfErrors, JobItemsProcessed,
TotalJobItems, CreatedBy.Email
FROM AsyncApexJob WHERE Id =
:BC.getJobId()];
如一个batch有1000条记录,每次batch size为200,则被分成5次事务,每个事务Apex limit都会重置。如果第一个事务成功,第二个事务失败,则数据库更新
在第一个事务中进行的操作不会回滚。
你可以通过代码Database.executeBatch的方式启动一个batch,并通过ID来对batch进行状态查询 当然也可以通过 ID (System.abortJob)来停止一个batch job
ID batchprocessid = Database.executeBatch(reassign);
AsyncApexJob aaj = [SELECT Id, Status, JobItemsProcessed, TotalJobItems, NumberOfErrors
FROM AsyncApexJob WHERE ID =: batchprocessid ];
当org开启Apex flex queue,提交了batch之后会变成Holding状态, org中超过100 Holding batch job会出现LimitException抛出错误。在Apex flex queue中可以对Holding状态batch重新排序
也可以通过代码方式reorder
Boolean isSuccess = System.FlexQueue.moveBeforeJob(jobToMoveId, jobInQueueId);
不开启Apex flex queue,提交了batch之后会变成Queued 状态,超过5个batch job处于queued 或者active状态会抛出LimitException错误
Batch Job Statuses
|
Status
|
Description
|
|
Holding
|
Job has been submitted and is held in the Apex flex queue untilsystem resources become available to queue the job for processing.
|
|
Queued
|
Job is awaiting execution.
|
|
Preparing
|
The start method of the job has been invoked. This status can
last a few minutes depending on the size of the batch of records.
|
|
Processing
|
Job is being processed.
|
|
Aborted
|
Job aborted by a user.
|
|
Completed
|
Job completed with or without failures.
|
|
Failed
|
Job experienced a system failure
|
Batch Apex Governor Limits
• Up to 5 batch jobs can be queued or active concurrently.
• Up to 100 Holding batch jobs can be held in the Apex flex queue.
•在运行测试中,最多可以提交5个批处理作业。
• 24小时内执行的最大batch方法为25万或者user licenses * 200 (包含start excute finish方法)并且shared with 所有异步方法: Batch, Queueable, scheduled, and future methods.
•Batch start方法每个用户一次最多可以打开15个查询游标。excute,finish方法每个用户最多只能打开5个查询游标。
• QueryLocator 最多可以返回5000万条记录。如果超过5000万,batch job立即终止并标记为失败。
• 如果start方法使用QueryLocator 则excute方法最多可设置处理2000条记录每次,如设置高于2000 系统会自动帮助切成不大于2000的小批次。如果使用可迭代对象无最大返回数量限制,但是,如果您使用一个大的数字,您可能会遇到其他限制。
• 如果没有为excute方法指定批次大小则会默认每次执行200条记录。每次运行excute方法时apex limit会重置。
• The start, execute, and finish 方法最多可进行100次call out。
• 一个org只允许一个start方法同一时间运行,没有start的batch会停留在队列中
浙公网安备 33010602011771号