最近遇到乙個小型的秒殺活動,使用spring boot
,沒辦法團隊沒法大規模使用vert.x
。 好了,思路就是,將controller
裡面的方法包裝成乙個runnable
, 放到乙個單執行緒的執行緒池裡進行執行,任務成功後,將結果放入乙個map
裡,前端定期輪詢這個map
。一開始簡單粗暴的在某個service
裡建立乙個static final
的執行緒池,因為有些service
方法裡面有transactional
, 而且還使用了hibernate
的懶載入,這種簡單粗暴的寫法導致hibernate
無法獲取當前執行緒的session
,因為這個執行緒是使用自己new
出來的執行緒池的執行緒,不是spring
管理的。下面的寫法是正常好用的。
建立乙個介面
public
inte***ce
asyncservice
複製**
實現介面
裡面寫自己的業務邏輯
@service
public class asyncserviceimpl implements asyncservice catch (payexception pex) catch (exception e)
logger.info("end executeasync");
}}複製**
controller
string orderno = dto.getorderno();
string pwd = dto.getpwd();
if (stringutils.isempty(pwd) || stringutils.isempty(orderno))
asyncservice.executeasync(orderno, pwd);
}複製**
任務會在http請求來的建立,但是還沒有乙個執行任務的執行緒池。現在來建立乙個受spring
管理的執行緒池
執行緒池
@configuration
@enableasync
public
class
executorconfig
}複製**
建立完之後,要在 任務上新增乙個@async("asyncserviceexecutor")
註解,該註解的value
要和 執行緒池的asyncserviceexecutor()
對應上。如果你使用的idea
,那麼可以直接ctrl + 任務上的註解名字
,會跳到執行緒池這裡。 Spring boot中使用執行緒池
既然用了 springboot 那自然得發揮 spring 的特性,所以需要 spring 來幫我們管理執行緒池 configuration public class treadpoolconfig 使用時 resource name consumerqueuethreadpool private ...
springBoot執行緒池
1 定義執行緒池 enableasync configuration classtaskpoolconfig 上面我們通過使用threadpooltaskexecutor建立了乙個執行緒池,同時設定了以下這些引數 說明 setwaitfortaskstocompleteonshutdown true...
Springboot 執行緒池
配置類 configuration enableasync public class taskpoolconfig 執行執行緒中,如果有區域性變數要使用 或者有外部值傳入 新建thead 實現callable介面 可以直接使用函式中的值的話使用lambda表示式,使用completionservic...