前のブログ、http://www.vevb.com/article/106718.htmでは、Spring Bootの非同期操作を使用しました。その時点で、デフォルトのスレッドプールを使用しましたが、プロジェクトに従って独自のスレッドプールをカスタマイズしたい場合は、スレッドプールのカスタマイズ方法についてお話しましょう。
パッケージcom.chhliu.springboot.async.configuration; org.springframework.boot.context.properties.configurationPropertiesをインポートします。 @configurationProperties(prefix = "spring.task.pool")//この注釈の場所が有効になっています。今、それが環境にある限り、パブリッククラスtaskthreadpoolconfig {private int corepoolsize; Private int maxpoolsize; Private Int Keepaliveseconds;プライベートインクエカパティ。 ………省略ゲッター、セッターメソッド………}パッケージcom.chhliu.springboot.async.pool; java.util.concurrent.executorをインポートします。 java.util.concurrent.threadpoolexecutorをインポートします。 Import org.springframework.beans.factory.annotation.autowired; org.springframework.context.annotation.beanをインポートします。 org.springframework.context.annotation.configurationをインポートします。 org.springframework.scheduling.annotation.enableasyncをインポートします。 Import org.springframework.scheduling.concurrent.threadpooltaskexecutor; com.chhliu.springboot.async.configuration.taskthreadpoolconfigをインポートします。 @configuration @enableasync public class taskexecutepool {@autowired private taskthreadpoolconfig config; @Bean Public Executor mytaskasyncpool(){threadpooltaskexecutor executor = new SthreadPooltaskexecutor(); executor.setCorePoolsize(config.getCorePoolsize()); executor.setmaxpoolsize(config.getMaxpoolsize()); executor.setqueueCapacity(config.getueCapacity()); executor.setKeepaliveseConds(config.getKeepaliveseconds()); executor.setThreadNamePrefix( "myExecutor-"); // Reclection-Policy:プールが最大サイズに達したときの新しいタスクの処理方法// caller_runs:新しいスレッドでタスクを実行しないでください。 executor.Initialize();執行者を返す; }}パッケージcom.chhliu.springboot.async; Import org.springframework.boot.springApplication; Import org.springframework.boot.autoconfigure.springbootapplication; Import org.springframework.boot.context.properties.enableconfigurationproperties; org.springframework.scheduling.annotation.enableasyncをインポートします。 com.chhliu.springboot.async.configuration.taskthreadpoolconfigをインポートします。 @springbootapplication @enableasync @enableconfigurationproperties({taskthreadpoolconfig.class})//パブリッククラスSpringBootasyncApplicationをサポートする構成プロパティを有効に}}パッケージcom.chhliu.springboot.async.pool; org.slf4j.loggerをインポートします。 org.slf4j.loggeractoryをインポートします。 org.springframework.scheduling.annotation.asyncをインポートします。 org.springframework.stereotype.componentをインポートします。 @component public class asynctask {protected final logger logger = loggerfactory.getLogger(this.getClass()); @async( "mytaskasyncpool")// mytaskasyncpoolは、スレッドプールを構成する方法名です。ここでカスタムスレッドプールのメソッド名を記述しない場合、デフォルトのスレッドプールはpublic void dotask1(int i)arturtedexception {logger.info( "task"+i+"started")を使用します。 }}パッケージcom.chhliu.springboot.async; java.util.concurrent.executionexceptionをインポートします。 Import org.junit.test; Import org.junit.runner.runwith; org.slf4j.loggerをインポートします。 org.slf4j.loggeractoryをインポートします。 Import org.springframework.beans.factory.annotation.autowired; import org.springframework.boot.test.context.springboottest; Import org.springframework.test.context.junit4.springrunner; com.chhliu.springboot.async.pool.asynctaskをインポートします。 @runwith(springrunner.class)@springboottest public class springbootasyncapplicationTests {Protected final logger logger = loggerfactory.getLogger(this.getClass()); @autowired private asynctask asynctask; @test public void asynctasktest()throws arturnedexception、executionexception {for(int i = 0; i <100; i ++){asynctask.dotask1(i); } logger.info( "すべてのタスクが終了しました。"); }}テスト結果は次のとおりです。
2017-03-20 20:15:15.208 Info 4068 --- [MyExecutor-10] ccspringBoot.async.pool.asynctask:task60が開始されました。 2017-03-20 20:15:15.208 Info 4068 --- [myexecutor-25] ccspringboot.async.pool.asynctask:task61が開始されました。 2017-03-20 20:15:15.208 Info 4068 --- [myexecutor-6] ccspringboot.async.pool.asynctask:task62が開始されました。 2017-03-20 20:15:15.208 Info 4068 --- [myexecutor-23] ccspringboot.async.pool.asynctask:task63が開始されました。 2017-03-20 20:15:15.208 Info 4068 --- [myexecutor-20] ccspringboot.async.pool.asynctask:task64が開始されました。 2017-03-20 20:15:15.208 Info 4068 --- [MyExecutor-19] ccspringBoot.async.pool.asynctask:task65が開始されました。 2017-03-20 20:15:15.208 Info 4068 --- [MyExecutor-16] ccspringBoot.async.pool.asynctask:Task66が開始されました。 2017-03-20 20:15:15.208 Info 4068 --- [myexecutor-15] ccspringboot.async.pool.asynctask:task67が開始されました。 2017-03-20 20:15:15.208 Info 4068 --- [myexecutor-15] ccspringboot.async.pool.asynctask:task67が開始されました。 2017-03-20 20:15:15.208 Info 4068 --- [myexecutor-12] ccspringboot.async.pool.asynctask:task68が開始されました。 2017-03-20 20:15:15.209 Info 4068 --- [myexecutor-1] ccspringboot.async.pool.asynctask:task69が開始されました。 2017-03-20 20:15:15.209 Info 4068 --- [myexecutor-11] ccspringboot.async.pool.asynctask:task81が開始されました。 2017-03-20 20:15:15.209 Info 4068 --- [myexecutor-8] ccspringboot.async.pool.asynctask:task82が開始されました。 2017-03-20 20:15:15.209 Info 4068 --- [myexecutor-7] ccspringboot.async.pool.asynctask:task83が開始されました。 2017-03-20 20:15:15.209 Info 4068 --- [myexecutor-4] ccspringboot.async.pool.asynctask:task84が開始されました。 2017-03-20 20:15:15.209 Info 4068 --- [myexecutor-29] ccspringboot.async.pool.asynctask:task85が開始されました。 2017-03-20 20:15:15.209 Info 4068 --- [myexecutor-21] ccspringboot.async.pool.asynctask:task86が開始されました。 2017-03-20 20:15:15.209 Info 4068 --- [myexecutor-17] ccspringboot.async.pool.asynctask:task88が開始されました。
テスト結果は大丈夫です!
デフォルトのスレッドプールを使用したいが、デフォルトのスレッドプールの構成を変更するだけの場合は、どうすればよいですか?この時点で、Asyncconfigurerクラスを実装する必要があります。サンプルコードは次のとおりです。
java.lang.reflt.methodをインポートします。 java.util.concurrent.executorをインポートします。 java.util.concurrent.threadpoolexecutorをインポートします。 Import org.springframework.aop.interceptor.asyncuncaughtexceptionhandler; Import org.springframework.beans.factory.annotation.autowired; org.springframework.context.annotation.configurationをインポートします。 Import org.springframework.scheduling.annotation.asyncconfigurer; Import org.springframework.scheduling.concurrent.threadpooltaskexecutor; com.chhliu.cq.emailservice.threadconfiguration.taskthreadpoolconfigをインポートします。 Lombok.extern.slf4j.slf4jをインポートします。 / ** *注:このスレッドプールはすべての非同期タスクで共有されており、特定の非同期タスクに属していません *説明:非同期タスクを構成するためのスレッドプールasyncconfigurer {@autowired private taskthreadpoolconfig config; //プロパティクラスを構成するには、上記のコード@Overrideパブリックエグゼキューターgetasyncexecutor()を参照してください。 executor.setCorePoolsize(config.getCorePoolsize()); executor.setmaxpoolsize(config.getMaxpoolsize()); executor.setqueueCapacity(config.getueCapacity()); executor.setKeepaliveseConds(config.getKeepaliveseconds()); executor.setThreadNamePrefix( "taskexecutor-"); //拒否ポリティ:プールが最大サイズに達したときの新しいタスクの処理方法executor.Initialize();執行者を返す; } @Override public asyncuncaughtexceptionhandler getasyncuntexceptionhandler(){//非同期タスクでの例外処理新しいasyncuncaughtexceptionhandler(){@override public void handle handleuncaughtexception(throwable arg0、method arg1、object ... arg2){ log.error( "========================================================================================================= ========================================================================== =============================================================================== ========================================================================== =============================================================================== ========================================================================== ===============================================================================それを使用するときは、メソッドに@asyncを追加するだけです。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。