在一些业务场景下,我们需要指定时间,定期执行某段代码,比如定期清理垃圾,同步数据等。接下来以生日提醒为例完成一个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 = '[email protected]';//这里的邮箱最好不写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()便会抛出异常,如果需要达到目的,就只能使用批处理。
以上,希望能帮助到需要的朋友。