Spring Boot使用執行緒池處理事務任務

2021-09-11 21:09:28 字數 1448 閱讀 7583

最近遇到乙個小型的秒殺活動,使用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...