如何使用数据库。 Salesforce 中的批处理 Apex 状态化
已发表: 2023-11-21首先,我们必须明白,如果我们想要使用Batch Apex,我们必须编写一个Apex类来实现Salesforce提供的接口Database。 可批处理,然后以编程方式调用该类。 要监控或停止批量 Apex 作业的执行,请从“设置”中,在快速查找框中输入 Apex 作业,然后选择 Apex 作业。
在本文中,我们将深入探讨数据库的强大功能。 Batch Apex 中有状态。 了解数据库。 有状态对于跨批处理作业执行维护状态至关重要,它允许开发人员保留实例变量并创建更复杂的、状态感知的批处理过程。
批处理语法:
全局类 BatchName 实现 Database.Batchable{}Batch类的方法:
全局(Database.QueryLocator | Iterable)开始(Database.BatchableContext bc){
//这里我们将添加查询并将结果返回给execute方法
}
全局无效执行(Database.BatchableContext BC,列表<P>){
//逻辑必须在这里
}
全局无效完成(Database.BatchableContext BC){
//处理完所有批次后,将调用此方法。 我们可以在里面编写任何代码。 就像如果想向在执行方法中创建或更新的所有记录发送电子邮件一样。
}另请阅读:如何在 Salesforce 中创建自定义报表类型?
实现Database.Batchable接口
例子:
全局类 BatchAccountUpdate 实现 Database.Batchable{
字符串查询 = '从帐户 WHERE 名称中选择名称! = null AND (Name = \'Virendra Company\' OR Name = \'Virendra Sharma\') ';
全局 Database.QueryLocator 开始 (Database.BatchableContext bc) {
// 收集要传递执行的批次记录或对象
返回Database.getQueryLocator(查询);
}
全局无效执行(Database.BatchableContext bc,列表记录){
// 处理每批记录
for(帐户帐户:记录){
acc.Name = acc.Name + ' 已更新';
}
更新记录;
}
全局无效完成(Database.BatchableContext bc){
// 执行任何后处理操作,调用批处理类。
BatchUpdateAccountRelatedContacts b = new BatchUpdateAccountRelatedContacts();
数据库.executeBatch(b, 200);
}
}

数据库.有状态
以下示例类使用 QueryLocator 查找 start() 方法传入的所有帐户记录,并使用其帐户的邮寄地址更新关联的联系人。 最后,它会发送一封电子邮件,其中包含批量作业的结果,并且由于我们使用 Database.Stateful 来跟踪状态和更新的记录数。


例子:

Database.AllowsCallout
批量中的 Database.AllowsCallout 有助于将 Salesforce 与外部服务器集成。 要在批处理 Apex 中使用标注,我们必须在批处理类的类定义中使用 Database.AllowsCallouts 接口。
句法:
全局类 SearchAndReplace 实现 Database.Batchable、Database.AllowsCallouts{} 例子:
在这里,我将 Opportunity 对象与 Razorsync.com 集成
/*
从 razorsync 获取服务请求并将其更新到销售人员中
*/

全局类 Batch_SR_RazorSyncAPI 实现 Database.Batchable、Database.AllowsCallouts{
全局Database.QueryLocator开始(Database.BatchableContext BC){
字符串查询 = 'SELECT Id, Razorsync_Service_Request_Id__c FROM Opportunity WHERE Razorsync_Service_Request_Id__c != null AND Razorsync_Job_Status__c != \'作业完成\' AND RazorSync_Status__c = \'成功\'';
返回Database.getQueryLocator(查询);
}
全局无效执行(Database.BatchableContext BC,列表范围){
字符串状态;
for (机会 s : 范围){
//获取服务请求
System.debug(s.Id);
Http http1 = new Http();
HttpRequest 请求1 = new HttpRequest();
request1.setEndpoint('https://DomainName.0.razorsync.com/ApiService.svc/ServiceRequest/'+ s.Razorsync_Service_Request_Id__c);
request1.setMethod('GET');
request1.setHeader('Content-Type', 'application/json');
request1.setHeader('Host', 'DomainName.0.razorsync.com');
request1.setHeader('内容长度', '0');
request1.setHeader('连接', '保持活动');
request1.setHeader('服务器名称', '域名服务器名称');
request1.setHeader('Token', 'XXXXXXXXXXXXXXXXXXXXXXXX');
HttpResponse 响应1 = http1.send(request1);
if(response1.getStatusCode() == 200) {
地位;
JSONParser 解析器 = JSON.createParser(response1.getBody());
while(parser.nextToken() != null) {
if( (parser.getCurrentToken() == JSONToken.FIELD_NAME) && (parser.getText() == 'StatusId') || Test.isRunningTest()) {
解析器.nextToken();
StatusId = parser.getText();
}
}
系统.debug(StatusId);
if(StatusId == String.valueOf(1) || Test.isRunningTest()){
s.Razorsync_Job_Status__c = '工作完成';
s.StageName = '已结束';
}别的{
s.Razorsync_Job_Status__c = '工作';
}
}
}
更新范围;
}
全局无效完成(Database.BatchableContext BC){
}
}
另请阅读:Salesforce Commerce Cloud 的优势以及如何在 Salesforce 中从 Apex 调用流程
结论
在 Salesforce 内的 Batch Apex 中使用Database.Stateful允许在批处理作业中跨不同执行方法保留状态。 这对于需要复杂数据处理并且必须在批块之间保留状态的场景至关重要。
通过实现Database.Stateful ,开发人员可以确保数据一致性并有效管理大型数据集。 但是,明智地使用此功能很重要,以避免过多的内存消耗和潜在的性能问题。
最佳实践包括保持状态变量最少并关注基本数据,从而使Database.Stateful成为 Salesforce 中复杂的、依赖于状态的批处理的强大工具。
如需销售人员项目的进一步帮助,请聘请我们作为您的销售人员顾问并获得收益。
