5. 高级编程技巧 (Advanced Coding Techniques)
5.1 批处理(Batch)与调度 (Scheduling)
5.1.1 批处理类的定义与使用 (Batch Class Definition and Usage)
定义:
Salesforce中的批处理允许您处理大量数据而不会超过平台的限制。当创建一个批处理类时,它必须实现Database.Batchable<sObject>接口,它包含三个方法: start(), execute(), 和finish()。
global class SalesforcegogogoBatch implements Database.Batchable<sObject> {
global Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator('SELECT Name FROM Account');
}
global void execute(Database.BatchableContext bc, List<sObject> scope) {
List<Account> accounts = (List<Account>) scope;
for(Account acc : accounts) {
// 这里处理每个账户的逻辑
}
}
global void finish(Database.BatchableContext bc) {
// 例如,发送邮件通知管理员
}
}
start()描述:
这个方法是批处理的开始。它返回一个Database.QueryLocator对象,该对象代表了需要处理的记录集。此方法仅在整个批处理过程的开始时调用一次。
用途:
·定义要处理的记录。
·初始化任何需要的资源或变量。
代码示例:
global Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator('SELECT Name FROM Account WHERE Industry = \'Technology\'');
}
这个示例中,start方法定义了一个查询,该查询选择了所有行业为“Technology”的账户。
execute()描述:
一旦start方法定义了要处理的记录,execute方法则会为每一个批次的记录调用一次。例如,如果您选择了1,000条记录并设置了一个批处理大小为100,那么execute方法会被调用10次。
用途:
·实施核心的数据处理逻辑。
·对每个批次的记录进行操作,如更新、插入或删除。
代码示例:
global void execute(Database.BatchableContext bc, List<sObject> scope) {
List<Account> accountsToUpdate = new List<Account>();
for(Account acc : (List<Account>)scope) {
acc.Description = 'Updated by Batch Process';
accountsToUpdate.add(acc);
}
update accountsToUpdate;
}
在此示例中,execute方法遍历每个批次的账户记录,并更新其描述。
finish()描述:
这是批处理的最后阶段,当所有记录都已处理完毕后,会调用此方法。此方法通常用于后续的处理,如发送电子邮件通知或启动另一个批处理。
用途:
·清理资源。
·通知关键人员处理已完成。
·触发其他相关的进程或任务。
代码示例:
global void finish(Database.BatchableContext bc) {
AsyncApexJob job = [SELECT Id, Status, NumberOfErrors, JobItemsProcessed,
TotalJobItems, CreatedBy.Email
FROM AsyncApexJob
WHERE Id = :bc.getJobId()];
// 发送邮件通知管理员批处理的状态
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
mail.setToAddresses(new String[] {job.CreatedBy.Email});
mail.setSubject('Batch Job Completed');
mail.setPlainTextBody('The batch job is done with status: ' + job.Status);
Messaging.sendEmail(new Messaging.SingleEmailMessage[] {mail});
}
在此示例中,finish方法发送一封电子邮件到创建此批处理作业的用户,告知其批处理的完成状态。
在Setup (设置)中, 进入Apex Classes. 你可以在此处查看和管理所有的Apex类。要创建新的批处理类,请点击New。
Apex Classes Setup Salesforce的Apex类设置页面
执行:
为了执行你的批处理:
SalesforcegogogoBatch batch = new SalesforcegogogoBatch();
Database.executeBatch(batch, 100); // batchSize为100
批处理的执行会在后台进行。要查看批处理的状态,进入Setup > Apex Jobs. 这里会显示所有Apex任务的状态。
5.1.2 调度Apex代码 (Scheduling Apex Code)
定义:
调度Apex代码允许你在特定的日期和时间自动运行代码。要调度Apex代码,你需要创建一个实现Schedulable接口的类。
global class SalesforcegogogoScheduler implements Schedulable {
global void execute(SchedulableContext sc) {
SalesforcegogogoBatch batch = new SalesforcegogogoBatch();
Database.executeBatch(batch, 100);
}
}
在Setup中, 进入Apex Classes然后选择Schedule Apex按钮。从这里,你可以选择你的调度类,设置日期、时间和频率。
5.1.3 监视和优化批处理性能 (Monitoring and Optimizing Batch Performance)
监视:
进入Setup > Apex Jobs可以查看所有Apex任务的状态,包括它们的进度,成功的记录数,失败的记录数等。
Apex Jobs Monitor Salesforce的Apex任务监视页面
优化:
调整batchSize: 适当的batchSize可以优化性能。较小的值可能导致更多的批处理,而较大的值可能导致超出限制。
优化SOQL查询: 避免不必要的子查询或连接。
使用异步操作: @future方法或队列化的Apex可以帮助处理长时间运行的操作。
详细参考:Asynchronous Apex