Salesforce(0):编写可调度的顶点类以每天发送电子邮件

导读:本篇文章讲解 Salesforce(0):编写可调度的顶点类以每天发送电子邮件,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

📖摘要


今天博主将给大家分享–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

  1. 在顶点作业开始时会自动调用Start Method。此方法将收集应在其上执行操作的记录或对象。这些记录分为子任务并传递给执行方法。

  2. Execute方法执行我们要对从start方法获取的记录执行的操作。

  3. 完成所有批次后,执行Finish方法。使用此方法发送确认电子邮件通知。

何时使用Batch Apex

一个示例是,如果您需要对组织中的每个帐户进行字段更新。如果您的组织中有10001个帐户记录,那么如果不采用某种方法将其拆分是不可能的。因此,在start()方法中,您将定义要在此批处理上下文中使用的查询:“从帐户中选择ID”。然后execute()方法运行,但只接收相对较短的记录列表(默认为200)。在execute()中,所有内容都在其自己的事务上下文中运行,这意味着几乎所有的调控器限制仅适用于该块。因此,每次运行execute()时,都允许您进行150个查询和50,000个DML行,依此类推。当execute()完成时,将使用下一组200个帐户实例化一个新帐户,并设置一组全新的调控器限制。最后,finish()方法会根据需要包装所有松散的末端。

批处理Apex中的限制

  1. Apex最多允许五个排队或活动的批处理作业
  2. 分别跟踪不同Force.com功能的光标限制。例如,您可以同时打开50个Apex查询游标,50个批处理游标和50个Visualforce游标。
  3. 在Database.QueryLocator对象中最多可以返回5000万条记录。如果返回的记录超过5000万,则批处理作业将立即终止并标记为“失败”
  4. 如果start方法返回QueryLocator,则Database.executeBatch的可选scope参数的最大值可以为2,000。如果设置为较高的值,则Salesforce会将QueryLocator返回的记录分块为最多2,000条记录的较小批次。如果start方法返回一个Iterable,则scope参数值没有上限;但是,如果使用很高的数字,则可能会遇到其他限制。
  5. 如果未使用Database.executeBatch的可选scope参数指定大小,则Salesforce将start方法返回的记录分块为200个批次,然后将每个批次传递给execute方法。执行。
  6. start,execute和finish方法每个最多可以实现10个标注
  7. 每24小时执行批处理的最大数量为250,000。8
    )在组织中一次只能运行一个批处理Apex作业的启动方法。尚未启动的批处理作业将在启动之前保留在队列中。请注意,此限制不会导致任何批处理作业失败,并且如果有多个作业正在运行,则批处理Apex作业的方法仍然可以并行运行

批处理Apex的需求

众所周知,Salesforce调控器对其数据的限制。当您要获取数千条记录或在对象的数千行上触发DML时,它在Salesforce中非常复杂,并且不允许您对满足总督限制的特定数量的记录进行操作。

但是对于大中型企业,每天管理成千上万的记录至关重要。在需要时添加/编辑/删除它们。

Salesforce提出了一个强大的概念,称为Batch Apex。批处理Apex允许您处理更多数量的记录并通过使用特定语法来处理它们。

  1. 如果您想每天甚至在特定时间间隔内处理大量记录,则可以使用Batch Apex
  2. 另外,当您希望操作异步时,可以实现Batch Apex。Batch Apex作为必须由开发人员实现的接口公开。批处理作业可以在运行时使用Apex进行编程调用。Batch Apex处理少量记录,涵盖您的整个记录​​集,并将处理分解为可管理的数据块。

🎉最后

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97498.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!