📖摘要
今天博主将给大家分享–Salesforce(0):编写可调度的顶点类以每天发送电子邮件。欢迎关注收藏!
🌂首先
代码如下
global class SendNotificationBatch implements Database.Batchable<sObject>, Schedulable, Database.Stateful {
//Variable Section
global FINAL String strQuery;
global List<String> errorMessages = new List<String>();
global SendNotificationBatch() {
this.strQuery = getBatchQuery();
}
//Returns the Query String to Batch constructor to fetch right records.
private String getBatchQuery() {
String strQuery = 'SELECT Id, CloseDate, Owner.Email FROM Opportunity WHERE CloseDate < TODAY';
return strQuery;
}
//Batch Start method
global Database.QueryLocator start(Database.BatchableContext BC) {
return Database.getQueryLocator(strQuery);
}
//Batch Execute method calls findCostForWoD method
global void execute(Database.BatchableContext BC, List<sObject> scopeList) {
System.debug(LoggingLevel.INFO, '== scopeList size ==' + scopeList.size());
List<Opportunity> oppList = (List<Opportunity>) scopeList;
if(!oppList.isEmpty()) {
List<Messaging.SingleEmailMessage> mailList = new List<Messaging.SingleEmailMessage>();
for (Opportunity prod : oppList)
{
Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {prod.Owner.Email};
Message.setToAddresses(toAddresses);
Message.SaveAsActivity = false;
mailList.add(Message);
}
if(!mailList.isEmpty()) {
try{
Messaging.sendEmail(mailList);
}
catch (Exception ex) {
errorMessages.add('Unable to send email to Tech: '+ ex.getStackTraceString());
}
}
}
}
//Batch Finish method for after execution of batch work
global void finish(Database.BatchableContext BC) {
AsyncApexJob aaj = [Select Id, Status, NumberOfErrors, JobItemsProcessed, MethodName, TotalJobItems, CreatedBy.Email from AsyncApexJob where Id =:BC.getJobId()];
// Send an email to the Apex job's submitter notifying of job completion.
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {aaj.CreatedBy.Email};
mail.setToAddresses(toAddresses);
mail.setSubject('JOB Salesforce Send Notification Batch: ' + aaj.Status);
String bodyText='Total Job Items ' + aaj.TotalJobItems + ' Number of records processed ' + aaj.JobItemsProcessed + ' with '+ aaj.NumberOfErrors + ' failures.\n';
bodyText += 'Number of Error Messages ' + errorMessages.size() + '\n';
bodyText += 'Error Message' + String.join(errorMessages, '\n');
mail.setPlainTextBody(bodyText);
Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
}
//Method which schedules the ProductDownloadBatch
global void execute(SchedulableContext sc) {
SendNotificationBatch snInstance = new SendNotificationBatch();
ID batchprocessid = Database.executeBatch(snInstance);
}
}
批处理Apex
批处理类允许您定义一个作业,该作业可以分解为可管理的块,这些块将被单独处理。
何时使用Batch Apex
一个示例是,如果您需要对组织中的每个帐户进行字段更新。如果您的组织中有10001个帐户记录,那么如果不采用某种方法将其拆分是不可能的。因此,在start()方法中,您将定义要在此批处理上下文中使用的查询:“从帐户中选择ID”。然后execute()方法运行,但只接收相对较短的记录列表(默认为200)。在execute()中,所有内容都在其自己的事务上下文中运行,这意味着几乎所有的调控器限制仅适用于该块。因此,每次运行execute()时,都允许您进行150个查询和50,000个DML行,依此类推。当execute()完成时,将使用下一组200个帐户实例化一个新帐户,并设置一组全新的调控器限制。最后,finish()方法会根据需要包装所有松散的末端。
Sample Batch Apex
-
在顶点作业开始时会自动调用Start Method。此方法将收集应在其上执行操作的记录或对象。这些记录分为子任务并传递给执行方法。
-
Execute方法执行我们要对从start方法获取的记录执行的操作。
-
完成所有批次后,执行Finish方法。使用此方法发送确认电子邮件通知。
何时使用Batch Apex
一个示例是,如果您需要对组织中的每个帐户进行字段更新。如果您的组织中有10001个帐户记录,那么如果不采用某种方法将其拆分是不可能的。因此,在start()方法中,您将定义要在此批处理上下文中使用的查询:“从帐户中选择ID”。然后execute()方法运行,但只接收相对较短的记录列表(默认为200)。在execute()中,所有内容都在其自己的事务上下文中运行,这意味着几乎所有的调控器限制仅适用于该块。因此,每次运行execute()时,都允许您进行150个查询和50,000个DML行,依此类推。当execute()完成时,将使用下一组200个帐户实例化一个新帐户,并设置一组全新的调控器限制。最后,finish()方法会根据需要包装所有松散的末端。
批处理Apex中的限制
- Apex最多允许五个排队或活动的批处理作业
- 分别跟踪不同Force.com功能的光标限制。例如,您可以同时打开50个Apex查询游标,50个批处理游标和50个Visualforce游标。
- 在Database.QueryLocator对象中最多可以返回5000万条记录。如果返回的记录超过5000万,则批处理作业将立即终止并标记为“失败”
- 如果start方法返回QueryLocator,则Database.executeBatch的可选scope参数的最大值可以为2,000。如果设置为较高的值,则Salesforce会将QueryLocator返回的记录分块为最多2,000条记录的较小批次。如果start方法返回一个Iterable,则scope参数值没有上限;但是,如果使用很高的数字,则可能会遇到其他限制。
- 如果未使用Database.executeBatch的可选scope参数指定大小,则Salesforce将start方法返回的记录分块为200个批次,然后将每个批次传递给execute方法。执行。
- start,execute和finish方法每个最多可以实现10个标注
- 每24小时执行批处理的最大数量为250,000。8
)在组织中一次只能运行一个批处理Apex作业的启动方法。尚未启动的批处理作业将在启动之前保留在队列中。请注意,此限制不会导致任何批处理作业失败,并且如果有多个作业正在运行,则批处理Apex作业的方法仍然可以并行运行
批处理Apex的需求
众所周知,Salesforce调控器对其数据的限制。当您要获取数千条记录或在对象的数千行上触发DML时,它在Salesforce中非常复杂,并且不允许您对满足总督限制的特定数量的记录进行操作。
但是对于大中型企业,每天管理成千上万的记录至关重要。在需要时添加/编辑/删除它们。
Salesforce提出了一个强大的概念,称为Batch Apex。批处理Apex允许您处理更多数量的记录并通过使用特定语法来处理它们。
- 如果您想每天甚至在特定时间间隔内处理大量记录,则可以使用Batch Apex
- 另外,当您希望操作异步时,可以实现Batch Apex。Batch Apex作为必须由开发人员实现的接口公开。批处理作业可以在运行时使用Apex进行编程调用。Batch Apex处理少量记录,涵盖您的整个记录集,并将处理分解为可管理的数据块。
🎉最后
-
更多参考精彩博文请看这里:《陈永佳的博客》
-
喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97498.html