1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Salesforce @future 使用方法

Posted at

  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有很多限制和规范,详情请参看官方文档。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?