(#)背景:來說一下具體的問題,業務上產品的意思是,處理這個請求不能用太多時間否則,用戶就會再次觸發這個請求。。。。如果采取正常的處理方式,一次沒有處理完成,
用戶再次點擊,還是沒反應,再點,,,,,,可能會造成雪崩,所以沒辦法,只能實現一個異步的處理流程,假裝處理完了,給用戶一個反饋,實際上就是給service實現一個Runanble接口,然后提交給線程池就完了,這個過程有一個坑.
(#)坑一:如果在spirng中我們不配置代理,會使用jdk代理,如果熟悉jdk代理的,可能都知道jdk代理只能針對接口進行代理,由於實現了Runnable接口,那么只能代理
這個runnable。。。。,所以下面在你獲取這個bean實例的時候,在進行轉型的時候,一定會拋出proxy63()$......一堆代理的錯誤,遇到這個問題其實主要是想明白原理
解決起來很簡單,直接使用cglib代理就可以了,因為cglib代理針對的是方法而不是接口.
(#)坑二(描述):spring對於事務的處理也是建立在代理的基礎上,所以會出現一個問題,就是一個類A中有a,b兩個方法,b方法是一個事務的,如果B類調用A類的b方法是可以保證事務的,因為這個可以代理,但是如果A類的a方法調用b方法,這個事務就保證不了了,因為代理的是a方法,而事務是加在b方法上的
1.可以在a方法上加上事務
2.可以在a方法中調用b方法之前動態的指定,強制代理