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

在一些业务场景下,我们需要指定时间,定期执行某段代码,比如定期清理垃圾,同步数据等。接下来以生日提醒为例完成一个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()便会抛出异常,如果需要达到目的,就只能使用批处理。

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





发布了38 篇原创文章 · 获赞 1 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章