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会停留在队列中
posted on 2021-04-30 11:14  Bzi~  阅读(596)  评论(0)    收藏  举报