一:@Async
? ? ????springboot想要使用異步處理的時候,我們會使用到@Async注解,表明某個方法為異步調(diào)用,我們需要使用@EnableAsync開啟異步調(diào)用。
但是有時候明明加了這兩個注解,異步確沒有起作用,我在開發(fā)中也遇到了這個問題,結(jié)果查閱資料發(fā)現(xiàn)調(diào)用異步的方法和異步方法不能在同一個類中,下面例子
@Test
public void TestAsync()throws InterruptedException {
????System.out.println("開始");
????testService.async();
????//async();這里調(diào)用同類中的async()不會起作用
? ? System.out.println("結(jié)束");
????Thread.sleep(5000);
}@Async
public void async(){
????try {
????System.out.println("async start");
????Thread.sleep(2000);
????System.out.println("async end");
}catch (InterruptedException e) {
????e.printStackTrace();
}
}
二:@Transactional
使用@Transactional時,有幾點需要注意:
? ? 1)、必須保證這個注解修飾的方法是public方法
? ? 2)、想要異?;貪L,必須是非檢查異常,即不用try-catch包裹,除非手動指明回滾類型rollbackFor=Exception.class
? ? 3)、調(diào)用事務(wù)的方法必須和事務(wù)方法不在同一個類中
具體原因是springboot使用@Transactional注解和@Async注解的時候是使用代理模式,jdk代理或者是cglib代理需要被實現(xiàn)或者繼承,所以必須是public方法,并且在同一類中方法在類體中執(zhí)行,沒法截獲方法調(diào)用