2017-10-12 61 views
2

我有一個REST web服務,並希望記錄任何傳入和傳出XML請求。 因爲它們可能非常大,我也必須應用某種轉換,所以我想在異步線程中執行它。哪個TaskExecutor用於異步日誌記錄?

到目前爲止,我只是在記錄器方法上使用了@Async註釋。這將使用默認SimpleAsyncTaskExecutor,這「不重用任何線程」: https://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#scheduling-task-executor-types

問:我應該更好地定義自己的ThreadPoolTaskExecutor,而不是依賴於默認簡單執行者?爲短期記錄任務建立「重用線程」執行程序是否明智?

進一步考慮:我也將有一些異步數據庫行更新,也應該使用@Async執行,並可能使用相同的執行程序。

我的主要問題是:我不想考慮線程,容量,節流限制等的固定池大小。我只想告訴我的例程:「在異步線程中執行以下邏輯。只需在它上面堆疊任何東西。

我需要使用哪個TaskExecutors以及應該應用哪種配置?

會例如下面的執行者適合?

@Bean 
public ThreadPoolTaskExecutor asyncExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setCorePoolSize(4); 
    return executor; 
} 

回答

1

我應該更好地定義自己的ThreadPoolTask​​Executor類,而不是依賴於默認簡單執行者?

使用默認值ThreadPoolTaskExecutor,除非您需要自定義它。

對於短暫的日誌記錄任務有一個「重用線程」執行器是明智的嗎?

是的。

我不想考慮固定池大小的線程,容量,節流限制等。我只想告訴我的例程:「在異步線程中執行以下邏輯。只需在它上面堆疊任何東西。

我必須使用哪個TaskExecutors,以及應該應用哪個配置?

ThreadPoolTaskExecutor是夠好的。在示例代碼中將池大小設置爲Runtime.getRuntime().availableProcessors()

+0

我應該將'corePoolSize'還是'maxPoolSize'設置爲處理器數量?或兩者? – membersound

+0

maxPoolSize。如果你不想將它作爲FixedThreadPool處理,請設置這兩個值。 –

+0

如果我開始例如'corePoolSize = 1':它何時會增加?如果一個過程仍在進行中?因此,如果我有4個併發日誌語句,它們會直接記錄在4個核心/線程上嗎?或者它們會堆棧在pool1的隊列中,因爲只有當該池的隊列已滿時,poolSize纔會增加? (並且afaik隊列在ThreadPoolTask​​Executor中默認是無效的?) – membersound