2017-10-12 16 views
2

私はRESTウェブサービスを持っており、着信と発信のXMLリクエストをログに記録します。 非常に大きくて、何らかの変換を適用する必要があるので、私は非同期スレッドでそれを実行したいと思います。非同期ロギングに使用するTaskExecutorはどれですか?

これまでのところ、私はloggerメソッドで@Asyncアノテーションを使用しています。 https://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#scheduling-task-executor-types

質問:私はより良いではなく、デフォルトの単純な実行者に頼るよりも、自分自身のThreadPoolTaskExecutorを定義する必要があること「とは、任意のスレッドを再利用していない」デフォルトSimpleAsyncTaskExecutorを、使用しますか?短寿命のロギングタスクに「再利用スレッド」エグゼキュータを持つことは賢明でしょうか?

さらに検討する:私はまた、@Asyncを使用して実行する必要があります、おそらく同じエグゼキュータを使用して、いくつかの非同期データベース行の更新があるでしょう。

私の主な問題は、スレッド、容量、スロットル制限などの固定プールサイズについて考えたくありません。「非同期スレッドで次のロジックを実行してください」と伝えるだけです。そして、それに何かを積み重ねてください。

TaskExecutorsのどれを使用する必要がありますか。どの設定を適用する必要がありますか?

たとえば、次のエグゼキュータは適合しますか?あなたの問題に合ったThreadPoolTask​​Executor

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

答えて

1

私はより良いではなく、デフォルトの単純な実行者に頼るよりも、自分自身のThreadPoolTask​​Executorを定義する必要がありますか?

カスタマイズする必要がない場合は、デフォルトのThreadPoolTaskExecutorを使用してください。

短期間のロギングタスクに「再利用スレッド」エグゼキュータを持つことは賢明でしょうか?

はい。

私はちょうど私の日常を伝えたいの固定プール・スレッドのサイズ、容量、スロットル制限など考えたくはありません:「非同期スレッドで次のロジックを実行します。」そして、それに何かを積み重ねてください。

どのTaskExecutorを使用する必要があり、どの設定を適用する必要がありますか?

ThreadPoolTaskExecutorで十分です。あなたのサンプルコードでプールサイズをRuntime.getRuntime().availableProcessors()に設定してください。

+0

プロセッサに「corePoolSize」または「maxPoolSize」を設定する必要がありますか?または両方? – membersound

+0

maxPoolSize。FixedThreadPoolとして扱わない場合は、両方の値を設定します。 –

+0

そして、もし私が 'corePoolSize = 1'で始めるなら、いつそれを増やすのですか? 1つのプロセスがまだ進行中の場合したがって、4つの同時ログ・ステートメントがある場合、4つのコア/スレッドで直接ログに記録されますか?または、プールのキューがいっぱいになった場合にのみpoolSizeが増加するため、それらはpool1のキューにスタックされますか? (そして、ThreadPoolTask​​Executorのデフォルトでキューは無限になっていますか?) – membersound

関連する問題