Queueable :向队列中添加作业并监视它们。与使用future方法相比,使用接口是运行异步Apex代码的一种增强方式。与Future相比Queueable 允许传参为Sobject等类型
trigger AccountTrigger on Account (after update) {
List<AccUpdateOpenIdOutboundQueueable> accQues=new List<AccUpdateOpenIdOutboundQueueable();
accQues.add(new AccUpdateOpenIdOutboundQueueable(new list<Account>{},oldMap);
System.enqueueJob( que );
}
global class testQueueable implements Queueable {
private List<Account> accs;
private Map<Id,Account> oldMap;
public testQueueable (List<Account> accs,Map<Id,Account> oldMap){
this.accs=accs;
this.oldMap=oldMap;
}
public void execute(QueueableContext context) {}
Queueable 最多同时存在50个,可以通过下面代码进行判断进行排队执行
//检查是否有超限制,如果超限,则重新起一个Queue
private static Boolean isOverLimit() {
Integer limitQJobs =Limits.getLimitQueueableJobs() ;
Integer currentQJobs=Limits.getQueueableJobs();
System.debug('limitQJobs::'+limitQJobs+';currentQJobs::'+currentQJobs);
return currentQJobs < limitQJobs ?false:true;
}
public static void executeQueueables(List<Queueable> ques){
List<Queueable> remainques=new List<Queueable>();
for(Queueable que:ques){
if(!isOverLimit()){
System.enqueueJob( que );
}else{
remainques.add(que);
}
}
//生成一个时间戳
String cronString=generateCron(0);
if(remainques.size()>0){
//处理剩余的Queueable
System.schedule('ExecuteWaitSchedule-' + cronString, cronString, new ExecuteWaitSchedule( remainques));
}
}
Queueable 可以串联5个进行执行
Future :future 异步方法参数只能是标准类型,不能有返回值, 同时在trigger 中调用 callout 必须为true,复杂处理尽量使用Queueable,同时多个Future 执行顺序不一定,需要按顺序使用Queueable
callout true 一般用在调用外部系统接口时使用, 默认为false
@future(callout=true)
public static void testFutrueCallout(String objectId){
String API_URI = domainUrl;
String url ='';
Map<String ,String> params_map = new Map<String,String>();
params_map.put('xxx',objectId);
rl = API_URI+'/externalSystem/Sync/SyncTest?'+params ;
Http h = new Http();
HttpRequest req = new HttpRequest();
req.setEndpoint(url);
req.setMethod('GET');
HttpResponse res = h.send(req);
}
Batch: 批量执行大量数据
需要有start、execute、finish方法
start方法在批处理开始时调用,将查询到的结果传给execute方法
使用 QueryLocator 对象,会绕过 SOQL 查询检索的记录总数的限制 5000 万条记录
execute处理从start中传进来的数据时,处理的顺序不能保证
如果执行一次batch处理1000条数据,batch size是200,那么跑5次execute方法,也就是5个事务,每个事务中处理200条数据。如果第一个事务成功,第二个事务失败,那么第一个事务中对数据的更新不会回滚
finish方法在所有批次数据都处理完毕后调用,可用于发邮件等操作
可以在finish中执行另外一个新的batch
batch size默认是200 max 2000
Database.Stateful使变量在事务之间保留其值
public class SummarizeAccountTotal implements
Database.Batchable<sObject>, Database.Stateful{
public final String Query;
public integer Summary;
public SummarizeAccountTotal(String q){
Query=q;
Summary = 0;
}
public Database.QueryLocator start(Database.BatchableContext bc){
return Database.getQueryLocator(query);
}
public void execute(Database.BatchableContext bc, List<sObject> scope){
for(sObject s : scope){
Summary = Integer.valueOf(s.get('total__c'))+Summary;
}
}
public void finish(Database.BatchableContext bc){
}
Schedulable: 用于定时执行某一个任务,一般用于定时执行调用batch 100 scheduled Apex jobs at one time