Salesfoce Queueable & Future

来源:互联网 发布:mac休眠后继续下载吗 编辑:程序博客网 时间:2024/06/13 22:21

前言


Salesforce并没有提供直接的Thread管理(平台安全和稳定大于山哈)。但是提供了几种异步或者说不在同一Transaction的内置方式:Schedule、Batchable、Queueable和Future Method。在此前的篇幅中有聊过Schedule类似于JAVA中的Timer,是一种定时调度;Batchable是占用长时间去运行批量数据。那么Queueable和Future是我们在程序中更频繁使用的一种异步方式。

介绍


  • Queueable:可以控制Apex异步执行进度,并且可以将作业增加到队列中并实施监控,同时可以在运行期间部分限制上限比一般Apex Class要高。相对于Future方式而言,更可靠(保障结果输出,在调用后不会delay)
  • Future:一种异步调用方式,有自己的线程不和主线程混用。可以在运行期间提高部分限制上限(默认与一般Apex Class相同)。通常使用场景为避免DML操作和CallOut操作混合在一起(会抛出DML Error)。需要说明的是Future方式并不保证运行结果(调用后可能delay),Future一旦执行后就脱离主线程进入到自己的线程(数据不共享),不提供管控的方式。
总体而言:Queueable和Future是非常类似的,但是又增强了部分功能:提供管理和监控、实施链式作业和参数不同。Future方式的参数只允许为基础类型(例如String,Boolean等),object无法作为参数;Queueable可以使用object作为参数(准确的讲是在执行时允许object进入,这个位置不太好说)。

案例说明

  • Queueable
    public class AsyncExecutionExample implements Queueable {public void execute(QueueableContext context) {System.enqueueJob(new SecondJob(objects));}}
    说明:这是一个简单的链式作业,参数传入可以在构造函数中传入。
    • 调用方式:
      System.enqueueJob(new SecondJob());
    • 销毁方式:
      System.abortJob(rtId);
  • Future
    global class FutureMethod {@future(callout=true)public static void test(List<ID> recordIds){//logic}}
    说明:callout=true代表允许进行CallOut(Web Service/Http)。需要注意的是Future方式只允许为静态方式并且返回类型为空。
    • 调用方式:在当前线程中以静态方法的方式调用即可;
    • 销毁方式:不提供,随着逻辑流完成后停止。

可提高限制


可以高上限为:堆(Heap)、CPU运行时间(CPU)、SOQL查询次数(SOQL)、DML操作次数(DML)和返回数据条数(DMLRows)。设置方式为“limits='2XCPU'”,代表CPU可用时间是正常的双倍(正常:60,000 ms)。

心得


  • 正常情况下:Future Method可解决绝大多数的问题,但如果要可靠的结果最好选择Queueable方式实现;
  • 使用Future尽可能快的开始执行(避免delay),同时避免大数据量;
  • 使用Future方式不允许调用Batch等其他方法(限制比较多);
  • 对于接口,例如QueueableContext、BatchableContext等,主要是获取rtId;
  • 在使用过程中多参照Limits,以避免触发限制。

参考


https://resources.docs.salesforce.com/208/latest/en-us/sfdc/pdf/salesforce_apex_language_reference.pdf