Future方法用于异步处理,常用于Web service callout操作.Future方法需要有几个规范:
1.方法必须是静态static的;
2.方法上方需要使用@Future标签;
3.方法返回类型必须是void类型;
4.方法参数必须是模块私有的变量,不能使public等;
5.方法参数不允许使用标准的Object或sObject类型,可以使用基本类型或者集合类型;
6.不能再一个future方法调用另一个future方法,当future方法运行的时候也不可以在trigger中调用;
7.future方法中不能使用getContent()和getContentAsPDF()方法。
以下为Future方法代码举例。此方法用来输出符合Id在形参List中的所有Account的Id。
public with sharing class FutureSample {
@future
public static void futuremethod(List ids) {
String sql = 'select Id,Name from Account where Id in :ids';
List accounts = Database.query(sql);
for(Account account : accounts) {
System.debug(account.Id);
}
}
}
有几点需要注意:
1)future方法执行不保证质量,如果需要好的质量可以使用Queueable方法;
2)可以允许两个future方法同时运行,当两个future方法同时对一条记录进行操作时,可能引起记录锁定或者运行时异常。
总之,使用future方式不保证质量。。。。。。而且有很多限制,开发的时候能不用就不用,如果必须使用情况下自己评估一下。
测试future方法在Test类中执行,和普通的方法测试区别的是,future方法执行需要在Test.startTest()和Test.stopTest()方法中进行.以下为测试代码:
@isTest
private class Test_FutureSample {
static testMethod void myUnitTest() {
Test.startTest();
List ids= new ID[]{'0012800000Hz6ozAAB','0012800000Hz6oxAAB'};
FutureSample.futuremethod(ids);
Test.stopTest();
}
}
Queueable
Queueable接口有着类似future的特性,类似将future特性和批处理功能混合在一起,相对future方法来讲,有很大的优势:
1.可以使用Object和sObject类型作为参数;
2.便于监控,可以直接通过System.enqueueJob()方法运行返回AsyncApexJob ,方法不用限制在startTest()和stopTest()方法中;
3.可以链接两个job,一个Queueable接口方法可以调用另一个Queueable接口。
Queueable在执行异步的时候大部分可以替代掉future,但是不是所有的情况都可以替换。当一个方法有时需要同步执行有时需要异步执行,相对来讲用future操作更为简单,毕竟不需要修改方法的内容,只是注解而已。
Queueable接口代码举例:
public with sharing class QueueableSample implements Queueable{
private List<ID> ids{get;set;}
public QueueableSample(List<ID> ids) {
this.ids = ids;
}
public void execute(QueueableContext qc) {
String sql = 'select Id,Name from Account where Id in :ids';
List<Account> accounts = Database.query(sql);
for(Account account : accounts) {
System.debug(account.Id);
}
}
}
运行实现QueueableSample接口的类的方式如下:
@isTest
private class Test_QueueableSample {
static testMethod void myUnitTest() {
Test.startTest();
List ids= new ID[]{'0012800000Hz6ozAAB','0012800000Hz6oxAAB'};
QueueableSample sample = new QueueableSample(ids);
ID jobID = System.enqueueJob(sample);
Test.stopTest();
}
}
Queueable尽管很好用很强大,不过force.com对于Queueable有很多限制和规范,详情请参看官方文档。