讓方法被調用后異步的執行
一般來說,要異步執行一個任務都是創建一個線程來專門干這個任務。在springboot中有 @Async 這個注解快速實現方法的異步執行。只需要兩步:第一步: 在啟動類上加上@EnableAsync注解,表示這個程序支持異步的方法。如下:
@EnableAsync @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
第二步:在service層的類的方法上寫上@Async注解,表示這個方法是異步執行的。如下:
@Service public class MyService { @Async public void doA() { //doSomething } }
這樣,doA()方法被外部調用后就是異步執行的了。
注意:1. 要想使被調用的方法確實是異步的執行,必須是外部調用,在本類的內部其他方法調用此方法仍然是同步的。也因此,異步方法必須是public修飾。
2.關於返回值: 由於是異步執行方法,這個方法被調用后因此我們也無法知道它什么時候執行完畢。因此在異步方法前加上返回值是會出問題的。例如:
@Service public class MyService { @Async public Integer doA() { //doSomething return 1; } } -------------------------------------- public class Test { public static void main(String[] args) { MyService ms = new MyService(); System.out.println(ms.doA()); //嘗試調用異步方法 doA 獲得返回值,並輸出 } }
這樣是不能正常獲得doA()方法的返回值的,因為在我們輸出doA()的返回值時,doA()甚至可能一行代碼都沒執行完畢。
所以如果異步方法不是void返回類型,為其他返回類型時被調用一律直接返回 null,如果返回類型是基本數據類型由於返回的是 null 則可能拋出裝箱異常。
如果確實需要獲取異步方法的返回值,則需要使用Future類:
@Service public class MyService { @Async public Future<Integer> doA() { //使用Future類接收返回值 //doSomething return 1; } }
Future類的具體用法這里不講。
讓方法定時的執行
要將一個方法變為定時執行,步驟與上面一樣,首先在啟動類上加注解 @EnableScheduling,然后在具體的方法上加上 @Scheduled 注解即可。要使用@Scheduled注解完成目標,主要是要熟練使用注解的參數。
(圖片來源於葛香東視頻課 《springboot 編寫restful api》)
cron是按指定時鍾定時執行,一般需要搭配zone指定時區。
其他三個參數則是方法按指定頻率或間隔執行。
cron是一個字符串,用來表示定時執行的具體規則。從左至右分別為 “秒 分 時 日 月 星期幾 年” 年可為空 ,表示任意年。
舉例: