异步进程:
异步进程用于在单独的线程内来运行进程。异步进程是一个在后台运行,不需要用户等到任务结束的进程或者方法。异步进程好处很多,包括不需要用户等待,节省响应时间等等。
异步进程主要有以下几种形式:
类型 |
介绍 |
常用场景 |
Future方法 |
在自己线程中运行,直到资源可用才行 |
Web service callout. |
Batch Apex |
运行大量的Job,数量超过正常处理限制 |
数据DML操作 |
QueueableApex |
和Future类似,但是提供额外的工作链,允许完成更复杂的类型 |
执行顺序处理操作与外部Web服务。 |
ScheduledApex |
计划指定时间运行Apex |
固定时间的任务,例如每日或每周等任务 |
- Future方法
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()方法。
有几点需要注意:
1)future方法执行不保证质量,如果需要好的质量可以使用Queueable方法;
2)可以允许两个future方法同时运行,当两个future方法同时对一条记录进行操作时,可能引起记录锁定或者运行时异常。
总之,使用future方式不保证质量。。。。。。而且有很多限制,开发的时候能不用就不用,如果必须使用情况下自己评估一下。
- Queueable
Queueable接口有着类似future的特性,类似将future特性和批处理功能混合在一起,相对future方法来讲,有很大的优势:
1.可以使用Object和sObject类型作为参数;
2.便于监控,可以直接通过System.enqueueJob()方法运行返回AsyncApexJob ,方法不用限制在startTest()和stopTest()方法中;
3.可以链接两个job,一个Queueable接口方法可以调用另一个Queueable接口。
Queueable在执行异步的时候大部分可以替代掉future,但是不是所有的情况都可以替换。当一个方法有时需要同步执行有时需要异步执行,相对来讲用future操作更为简单,毕竟不需要修改方法的内容,只是注解而已。
- ScheduledApex
定时任务相对来说,使用比较方便。当你需要在指定时间日期去执行某些操作(比如定期清理垃圾数据等等)时,定时任务就显得尤为便利。
定时任务的声明和调用都很简单,通过以下步骤即可完成操作:
1.实现Schedulable接口,并重写execute方法,此方法体内实现需要定时执行的操作;
2.使用System.schedule()方法实现定时任务的调用。
注意:定时任务在每24小时同时只允许最多100个定时任务。超过数量则会抛出异常。
System.schedule()方法有三个参数:第一个参数为定时任务名称;第二个参数为定时任务执行时间;第三个参数为需要执行的定时任务的对象。
关于定时任务执行时间有很多需要注意的地方:
执行时间字符串通过空格分隔每个时间点,时间点的顺序为:
Seconds Minutes Hours Day_of_month Month Day_of_week optional_year
最后,Schedulable除了在代码中通过System.schedule()方法启动定时任务还可以通过页面设置启动定时器。步骤如下:
1.点击setup-->develop-->Apex Classes;
2.点击Schedule Apex按钮;
3.输入Job Name,为定时任务显示的任务名称,点击Apex Class的查找按钮选择需要定时任务的实现Schedulable接口的类,设定时间,点击保存;
4.定时任务创建成功,在setup-->Jobs-->Scheduled Jobs中可以看到创建的定时任务了。
通过页面设置启动定时器和代码的区别为:使用页面配置定时器无法精确到分和秒。