Di blog sebelumnya, http://www.vevb.com/article/106718.htm Kami menggunakan operasi asinkron dari Spring Boot. Pada saat itu, kami menggunakan kumpulan utas default, tetapi jika kami ingin menyesuaikan kumpulan utas kami sendiri sesuai dengan proyek, mari kita bicara tentang cara menyesuaikan kumpulan utas!
paket com.chhliu.springboot.async.configuration; impor org.springframework.boot.context.properties.configurationproperties; @ConfigurationProperties (prefix = "spring.task.pool") // Lokasi anotasi ini telah diaktifkan. Sekarang, selama itu di lingkungan, TaskTreadPoolConfig kelas publik {private int corePoolsize; private int maxpoolsize; Keepaliveseconds int pribadi; Private int queuecapacity; ……… hilangkan Getter, Metode Setter ………} paket com.chhliu.springboot.async.pool; impor java.util.concurrent.executor; impor java.util.concurrent.threadpoolexecutor; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.context.annotation.bean; impor org.springframework.context.annotation.configuration; impor org.springframework.scheduling.annotation.enableasync; impor org.springframework.scheduling.concurrent.threadpooltaskexecutor; impor com.chhliu.springboot.async.configuration.taskthreadpoolConfig; @Configuration @eNableAsync kelas publik Taskexecutepool {@Autowired private TaskTreadPoolConfig config; Eksekutor publik @Bean mytaskasyncpool () {threadpooltaskexecutor executor = new ThreadPooltaskexecutor (); executor.setCorepoolSize (config.getCorepoolSize ()); executor.setMaxPoolSize (config.getmaxpoolSize ()); executor.setqueuecapacity (config.getQueueCapacity ()); executor.setkeepaliveseconds (config.getEkeKealiveseconds ()); Executor.setThreadnameprefix ("MyExecutor-"); // Penolakan-Polis: Cara Menangani Tugas Baru Ketika Pool telah mencapai ukuran Max // Caller_Runs: Jangan menjalankan tugas di utas baru, tetapi mengeksekusi Executor.setRECTEDExecutionHandler (ThreadPoolExecutor.CallerRunSpolicy ()); Executor.Initialize (); Return Executor; }} paket com.chhliu.springboot.async; impor org.springframework.boot.springapplication; impor org.springframework.boot.autoconfigure.springbootApplication; impor org.springframework.boot.context.properties.enableConfigurationProperties; impor org.springframework.scheduling.annotation.enableasync; impor com.chhliu.springboot.async.configuration.taskthreadpoolConfig; @SpringBootApplication @EnableAsync @EnableConfigurationProperties({TaskThreadPoolConfig.class} ) // Enable configuration properties to support public class SpringbootAsyncApplication { public static void main(String[] args) { SpringApplication.run(SpringbootAsyncApplication.class, args); }} paket com.chhliu.springboot.async.pool; impor org.slf4j.logger; impor org.slf4j.loggerFactory; impor org.springframework.scheduling.annotation.async; impor org.springframework.stereotype.component; @Component Public Class Asynctask {Protected Final Logger Logger = LoggerFactory.getLogger (this.getClass ()); @Async ("mytaskasyncpool") // mytaskasyncpool adalah nama metode untuk mengkonfigurasi kumpulan utas. Jika Anda tidak menulis nama metode kumpulan utas khusus di sini, kumpulan utas default akan digunakan public void dotask1 (int i) melempar interruptedException {logger.info ("Tugas"+i+"dimulai."); }} paket com.chhliu.springboot.async; impor java.util.concurrent.executionException; impor org.junit.test; impor org.junit.runner.runwith; impor org.slf4j.logger; impor org.slf4j.loggerFactory; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.boot.test.context.springboottest; impor org.springframework.test.context.junit4.springrunner; impor com.chhliu.springboot.async.pool.asynctask; @Runwith (springrunner.class) @springboottest kelas publik springbootasyncapplicationTests {logger final logger = loggerFactory.getLogger (this.getClass ()); @Autowired private asynctask asynctask; @Test public void asynctasktest () melempar interruptedException, executionException {for (int i = 0; i <100; i ++) {asynctask.dotaSk1 (i); } logger.info ("Semua tugas selesai."); }} Hasil tes adalah sebagai berikut:
2017-03-20 20: 15: 15.208 Info 4068 --- [myexecutor-10] ccspringboot.async.pool.asynctask: Task60 dimulai. 2017-03-20 20: 15: 15.208 Info 4068 --- [myexecutor-25] ccspringboot.async.pool.asynctask: Task61 dimulai. 2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecutor-6] ccspringboot.async.pool.asynctask: Task62 dimulai. 2017-03-20 20: 15: 15.208 Info 4068 --- [myexecutor-23] ccspringboot.async.pool.asynctask: Task63 dimulai. 2017-03-20 20: 15: 15.208 Info 4068 --- [myexecutor-20] ccspringboot.async.pool.asynctask: Task64 dimulai. 2017-03-20 20: 15: 15.208 Info 4068 --- [myExecutor-19] ccspringboot.async.pool.asynctask: Task65 dimulai. 2017-03-20 20: 15: 15.208 Info 4068 --- [myExecutor-16] ccspringboot.async.pool.asynctask: Task66 dimulai. 2017-03-20 20: 15: 15.208 Info 4068 --- [myexecutor-15] ccspringboot.async.pool.asynctask: Task67 dimulai. 2017-03-20 20: 15: 15.208 Info 4068 --- [myexecutor-15] ccspringboot.async.pool.asynctask: Task67 dimulai. 2017-03-20 20: 15: 15.208 Info 4068 --- [myexecutor-12] ccspringboot.async.pool.asynctask: Task68 dimulai. 2017-03-20 20: 15: 15.209 Info 4068 --- [myexecutor-1] ccspringboot.async.pool.asynctask: Task69 dimulai. 2017-03-20 20: 15: 15.209 Info 4068 --- [myExecutor-11] ccspringboot.async.pool.asynctask: Task81 dimulai. 2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-8] ccspringboot.async.pool.asynctask: Task82 dimulai. 2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-7] ccspringboot.async.pool.asynctask: Task83 dimulai. 2017-03-20 20: 15: 15.209 Info 4068 --- [myexecutor-4] ccspringboot.async.pool.asynctask: Task84 dimulai. 2017-03-20 20: 15: 15.209 Info 4068 --- [myexecutor-29] ccspringboot.async.pool.asynctask: Task85 dimulai. 2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-21] ccspringboot.async.pool.asynctask: Task86 dimulai. 2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-17] ccspringboot.async.pool.asynctask: Task88 dimulai.
Hasil tes OK!
Jika kita ingin menggunakan kumpulan utas default, tetapi hanya ingin memodifikasi konfigurasi kumpulan utas default, lalu apa yang harus kita lakukan? Pada saat ini, kita perlu mengimplementasikan kelas asyncconfigurer. Kode sampel adalah sebagai berikut:
impor java.lang.reflect.method; impor java.util.concurrent.executor; impor java.util.concurrent.threadpoolexecutor; impor org.springframework.aop.interceptor.asyncuncaughtExceptionHandler; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.context.annotation.configuration; impor org.springframework.scheduling.annotation.asyncconfigurer; impor org.springframework.scheduling.concurrent.threadpooltaskexecutor; impor com.chhliu.cq.emailservice.threadconfiguration.taskthreadpoolconfig; impor lombok.extern.slf4j.slf4j; / ** * CATATAN: Kumpulan utas ini dibagikan oleh semua tugas asinkron dan bukan termasuk tugas asinkron tertentu * Deskripsi: Thread Pool untuk mengkonfigurasi tugas asinkron * @author chhliu * waktu penciptaan: 22 Mei 2017 di 10:20:56 AM * @version 1.2.0 */ @slf4j @con @con @con @con @con @con @con @con @con @con @con @con @con @con. Asyncconfigurer {@autowired private TaskThreadPoolConfig config; // Untuk mengonfigurasi kelas properti, lihat kode publik @Override di atas getAsynceExecutor () {threadPooltaskExecutor Executor = new ThreadPooltaskExecutor (); executor.setCorepoolSize (config.getCorepoolSize ()); executor.setMaxPoolSize (config.getmaxpoolSize ()); executor.setqueuecapacity (config.getQueueCapacity ()); executor.setkeepaliveseconds (config.getEkeKealiveseconds ()); Executor.setThreadnameprefix ("Taskexecutor-"); // Penolakan-kebijakan: Cara menangani tugas-tugas baru ketika kolam telah mencapai ukuran maksimum // caller_runs: Tugas tidak dieksekusi di utas baru, tetapi utas di mana penelepon berada di Executor.setRECTEDExecutionHandler (new ThreadPoolExecutor.callerRunSpolicy ()); Executor.Initialize (); Return Executor; } @Override public asyncuncaughtExceptionHandler getAsyncaughtExceptionHandler () {// penanganan pengecualian dalam tugas asynchronous mengembalikan asyncuncaughtExceptionHandler baru () {@override void handleuncaughtException (Throwable arg0, Method arg1, objek ... arg2) { log.Error ("========================================================================================================================================= ================================================================ ================================================================ ================================================================ ================================================================ ================================================================ ================================================================ Saat menggunakannya, cukup tambahkan @Async ke metode ini.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.