Apex学习:一个计划任务与批处理的Demo

来源:互联网 发布:c语言入门经典第六版 编辑:程序博客网 时间:2024/05/22 14:23

在一些业务场景下,我们需要指定时间,定期执行某段代码,比如定期清理垃圾,同步数据等。接下来以生日提醒为例完成一个Demo。

创建一个对象Friend__c,里面包含字段:日期字段生日birthday__c和公式字段生日提醒时间remainder__c<等于生日日期-3>。计划任务的代码如下:

global class BirthdayRemindBatchScheduler implements Schedulable{global void execute(SchedulableContext SC){Database.executeBatch(new BirthdayReminderBatch(),200);}}

计划任务的实现类必须实现Schedulable接口,并覆盖execute方法。

然后选择依次选择:开发→Apex类→计划Apex。

设置作业名称,选定要执行计划任务类以及执行时间,保存。


这种方式只能将执行时间精确到小时,如果要更精确的时间需要使用代码在后台实现。

所有计划执行的任务都可以在作业→计划的作业中查看:


接下来是生日提醒的具体实现,BirthdayReminderBatch实现

global class BirthdayReminderBatch implements Database.Batchable<sObject> {public Date todayy;public String myEmailAddress = 'xxxx@xxx.com.cn';//这里的邮箱最好不写QQ邮箱地址,某些情况下Salesforce平台给QQ邮箱发送的邮件收不到global BirthdayReminderBatch() {todayy = Date.today();System.debug('todayy:' + todayy);}global List<Friend__c> start(Database.BatchableContext BC) {//remainder__c:生日提醒是作为一个辅助字段存在,用公式来快速定位时间,避免在类中操作List<Friend__c> list_con = new List<Friend__c>([select Id,Name,ownerId,owner.email from Friend__c where remainder__c =: todayy]);System.debug('*****朋友的信息*****' + list_con);return list_con;}   global void execute(Database.BatchableContext BC, List<Friend__c> scope) {   System.debug('*****execute_contact*****' + scope);   //发送邮件        for(Friend__c fri : scope){            Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();            email.setToAddresses(new String[]{myEmailAddress});                        email.setSubject('生日提醒');            email.setHtmlBody('您好,' + fri.Name + '的生日还有三天,请做好相关准备!');            Messaging.sendEmail(new Messaging.SingleEmailMessage[]{email});        }}global void finish(Database.BatchableContext BC) {}}

计划任务大部分情况下是与批处理一起使用的,实现批处理的类需要实现Database.Batchable<sObject>接口,并覆盖其三个生命周期方法:

//start方法,主要用于对数据的初始化和准备工作global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc){}//execute 方法,主要对数据的处理,每次都会被执行,业务逻辑的核心方法global void execute(Database.BatchableContext BC, list<P>){}//finish方法,主要用于批处理结束后的后续处理,比如发送邮件等global void finish(Database.BatchableContext BC){}


execute 中方法的List<P>集合即为start方法的返回值,可以直接在方法中使用。

批处理方法可以在页面上通过按钮来调用,也可以在后台通过代码,或者计划任务来调用。

在Apex中,对SQOL的操作有着诸多限制,譬如一次执行的SOQL的次数不能超过100次,查询的数据不能超过5000条等,遇到因为对于DML操作有限制,比如因为项目需求,需要修改50万条数据,直接调用Database.update()便会抛出异常,如果需要达到目的,就只能使用批处理。

以上,希望能帮助到需要的朋友。





阅读全文
0 0