【Salesforce Apex 教程】5.高级编程技巧① 批处理(Batch)与调度 (Scheduling)
2023年09月17日
文章浏览:358

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

关注 收藏