解決思路:
先檢視啟動類是否加上 @enableasync 註解,如果沒有,就加上該註解再重新啟動
檢視非同步方法的呼叫方式是否正確
@async的呼叫涉及到動態**,如果直接將需要非同步操作的方法寫到業務類中,業務類直接呼叫,則執行邏輯不會走到**類,非同步就會失效
例如用下面的方式呼叫(錯誤演示),非同步就不會生效,列印的結果必定為:1 2 3
@enableasync
public static void main(string args)
}@service
class aaaservice
@async
public void asyncmethod()
}因此需要將 @async 註解的方法單獨拿出來封裝到乙個類中,再將這個類注入到業務類中,業務類通過這個類來呼叫非同步方法
@enableasync
public static void main(string args)
}@service
class aaaservice
}@component
class asyncmanage
}輸出結果為:1 3 2 (如果非同步執行緒執行的很快,也有很小的概率是1 2 3)
(**存手打,不知道有沒有啥問題,能看懂意思就行...)
另外在網上也看到一些失效原因分析,貼過來看一下:
1.非同步方法使用註解@async的返回值只能為void或者future。
2.沒有走spring的**類。因為@transactional和@async註解的實現都是基於spring的aop,而aop的實現是基於動態**模式實現的。那麼註解失效的原因就很明顯了,有可能因為呼叫方法的是物件本身而不是**物件,因為沒有經過spring容器。
隨筆 springboot Async註解
在springboot中使用非同步執行緒,需使用 async註解。在啟動類上需增加 enableasync proxytargetclass true proxytargetclass為選擇何種 enableasync proxytargetclass true public static void...
Springboot Async註解簡單使用
啟動類 enablescheduling enabletransactionmanagement enableasync 被非同步呼叫的方法 async public void async throws interruptedexception 呼叫者 呼叫者 解決辦法 author yz clas...
springboot Async執行緒預設配置
async非同步方法預設使用spring建立threadpooltaskexecutor。預設核心執行緒數 8,最大執行緒數 integet.max value,佇列使用linkedblockingqueue,容量是 integet.max value 執行緒池拒絕策略 abortpolicy。可以...