ในบล็อกก่อนหน้า http://www.vevb.com/article/106718.htm เราใช้การทำงานแบบอะซิงโครนัสของ Spring Boot ในเวลานั้นเราใช้พูลเธรดเริ่มต้น แต่ถ้าเราต้องการปรับแต่งพูลเธรดของเราเองตามโครงการให้พูดคุยเกี่ยวกับวิธีการปรับแต่งพูลเธรด!
แพ็คเกจ com.chhliu.springboot.async.configuration; นำเข้า org.springframework.boot.context.properties.configurationProperties; @ConfigurationProperties (คำนำหน้า = "Spring.task.pool") // ตำแหน่งของคำอธิบายประกอบนี้ได้รับการเปิดใช้งานแล้ว ตอนนี้ตราบใดที่มันอยู่ในสภาพแวดล้อม TANSTHREADPOOLCONFIG {Private int corePoolSize; MaxPoolsize ส่วนตัว; Private Int KeepaliveSeconds; private int queuecapacity; ………ละเว้น getter วิธีการตั้งค่า………} แพ็คเกจ com.chhliu.springboot.async.pool; นำเข้า java.util.concurrent.executor; นำเข้า java.util.concurrent.threadpoolexecutor; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation.configuration; นำเข้า org.springframework.scheduling.annotation.enableasync; นำเข้า org.springframework.scheduling.concurrent.threadpooltaskexecutor; นำเข้า com.chhliu.springboot.async.configuration.taskthreadpoolconfig; @Configuration @enableasync คลาสสาธารณะ taskexecutepool {@autoWired TaskThreadPoolConfig config; @Bean Public Executor MyTaskasyncPool () {ThreadPoolTaskexecutor Executor = ใหม่ ThreadPoolTaskexecutor (); Executor.SetCorePoolSize (config.getCorePoolSize ()); Executor.SetMaxPoolSize (config.getMaxPoolsize ()); Executor.SetQueUecapacity (config.getqueUecapacity ()); Executor.SetKeepaliveseconds (config.getKeepaliveseconds ()); Executor.SetThreadNamePrefix ("MyExecutor-"); // การปฏิเสธนโยบาย: วิธีจัดการงานใหม่เมื่อพูลถึงขนาดสูงสุด // caller_runs: อย่าดำเนินงานในเธรดใหม่ แต่ Execute.setRejectedExecutionHandler Executor.initialize (); ส่งคืนผู้บริหาร; - แพ็คเกจ com.chhliu.springboot.async; นำเข้า org.springframework.boot.springapplication; นำเข้า org.springframework.boot.autoconfigure.springbootapplication; นำเข้า 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.loggerfactory; นำเข้า org.springframework.scheduling.annotation.async; นำเข้า org.springframework.stereotype.component; @Component คลาสสาธารณะ Asynctask {ป้องกัน logger สุดท้าย logger = loggerFactory.getLogger (this.getClass ()); @async ("MyTaskasyncPool") // MyTaskasyncPool เป็นชื่อวิธีการกำหนดค่าพูลเธรด หากคุณไม่ได้เขียนชื่อวิธีการของพูลเธรดที่กำหนดเองที่นี่พูลเธรดเริ่มต้นจะถูกใช้โมฆะสาธารณะ Dotask1 (int i) พ่น InterruptedException {logger.info ("task"+i+"เริ่มต้น"); - แพ็คเกจ com.chhliu.springboot.async; นำเข้า java.util.concurrent.executionException; นำเข้า org.junit.test; นำเข้า org.junit.runner.runwith; นำเข้า org.slf4j.logger; นำเข้า org.slf4j.loggerfactory; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.boot.test.context.springboottest; นำเข้า org.springframework.test.context.junit4.springrunner; นำเข้า com.chhliu.springboot.async.pool.asynctask; @runwith (SpringRunner.class) @springboottest ชั้นเรียนสาธารณะ SpringbootasynCapplicationTests {ป้องกัน logger สุดท้ายที่ได้รับการป้องกัน = loggerFactory.getLogger (this.getClass ()); @autowired Private Asynctask Asynctask; @Test โมฆะสาธารณะ ASYNCTASKTEST () พ่น InterruptedException, ExecutionException {สำหรับ (int i = 0; i <100; i ++) {asynctask.dotask1 (i); } logger.info ("งานทั้งหมดเสร็จสิ้น"); - ผลการทดสอบมีดังนี้:
2017-03-20 20: 15: 15.208 ข้อมูล 4068 --- [MyExecutor-10] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK60 เริ่มต้น 2017-03-20 20: 15: 15.208 ข้อมูล 4068 --- [MyExecutor-25] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK61 เริ่มต้น 2017-03-20 20: 15: 15.208 ข้อมูล 4068 --- [MyExecutor-6] CCSpringboot.async.pool.asynctask: Task62 เริ่มต้น 2017-03-20 20: 15: 15.208 ข้อมูล 4068 --- [MyExecutor-23] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK63 เริ่มต้น 2017-03-20 20: 15: 15.208 ข้อมูล 4068 --- [MyExecutor-20] CCSpringboot.async.pool.asynctask: Task64 เริ่มต้น 2017-03-20 20: 15: 15.208 ข้อมูล 4068 --- [MyExecutor-19] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK65 เริ่มต้น 2017-03-20 20: 15: 15.208 ข้อมูล 4068 --- [MyExecutor-16] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK66 เริ่มต้น 2017-03-20 20: 15: 15.208 ข้อมูล 4068 --- [MyExecutor-15] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK67 เริ่มต้น 2017-03-20 20: 15: 15.208 ข้อมูล 4068 --- [MyExecutor-15] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK67 เริ่มต้น 2017-03-20 20: 15: 15.208 ข้อมูล 4068 --- [MyExecutor-12] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK68 เริ่มต้น 2017-03-20 20: 15: 15.209 ข้อมูล 4068 --- [MyExecutor-1] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK69 เริ่มต้น 2017-03-20 20: 15: 15.209 ข้อมูล 4068 --- [MyExecutor-11] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK81 เริ่มต้น 2017-03-20 20: 15: 15.209 ข้อมูล 4068 --- [MyExecutor-8] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK82 เริ่มต้น 2017-03-20 20: 15: 15.209 ข้อมูล 4068 --- [MyExecutor-7] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK83 เริ่มต้น 2017-03-20 20: 15: 15.209 ข้อมูล 4068 --- [MyExecutor-4] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK84 เริ่มต้น 2017-03-20 20: 15: 15.209 ข้อมูล 4068 --- [MyExecutor-29] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK85 เริ่มต้น 2017-03-20 20: 15: 15.209 ข้อมูล 4068 --- [MyExecutor-21] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK86 เริ่มต้น 2017-03-20 20: 15: 15.209 ข้อมูล 4068 --- [MyExecutor-17] CCSPRINGBOOT.ASYNC.POOL.ASYNCTASK: TASK88 เริ่มต้นขึ้น
ผลการทดสอบก็โอเค!
หากเราต้องการใช้พูลเธรดเริ่มต้น แต่ต้องการแก้ไขการกำหนดค่าของพูลเธรดเริ่มต้นแล้วเราควรทำอย่างไร? ในเวลานี้เราจำเป็นต้องใช้คลาส ASYNCCONFIGURER รหัสตัวอย่างมีดังนี้:
นำเข้า java.lang.reflect.method; นำเข้า java.util.concurrent.executor; นำเข้า java.util.concurrent.threadpoolexecutor; นำเข้า org.springframework.aop.interceptor.asyncuncuncaughtexceptionhandler; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.context.annotation.configuration; นำเข้า org.springframework.scheduling.annotation.asyncconfigurer; นำเข้า org.springframework.scheduling.concurrent.threadpooltaskexecutor; นำเข้า com.chhliu.cq.emailservice.threadconfiguration.taskthreadpoolconfig; นำเข้า lombok.extern.slf4j.slf4j; / ** * หมายเหตุ: พูลเธรดนี้ถูกแชร์โดยงานแบบอะซิงโครนัสทั้งหมดและไม่ได้เป็นของงานอะซิงโครนัสที่แน่นอน * คำอธิบาย: พูลเธรดสำหรับการกำหนดค่างานแบบอะซิงโครนัส * @author Chhliu * เวลาสร้าง: 22 พฤษภาคม 2017 เวลา 10:20:56 น. ASYNCCONFIGURER {@AUTOWIRED TANSTHREADPOOLCONFIG กำหนดค่า; // ในการกำหนดค่าคลาสคุณสมบัติให้ดูรหัสด้านบน @Override Public Executor GetAsynceXecutor () {ThreadPoolTaskexecutor Executor = ใหม่ ThreadPoolTaskexecutor (); Executor.SetCorePoolSize (config.getCorePoolSize ()); Executor.SetMaxPoolSize (config.getMaxPoolsize ()); Executor.SetQueUecapacity (config.getqueUecapacity ()); Executor.SetKeepaliveseconds (config.getKeepaliveseconds ()); Executor.SetThreadNamePrefix ("taskexecutor-"); // การปฏิเสธนโยบาย: วิธีจัดการงานใหม่เมื่อพูลถึงขนาดสูงสุด // caller_runs: งานไม่ได้ดำเนินการในเธรดใหม่ แต่เธรดที่ผู้โทรอยู่ที่ Execute.setRejectedExecutionHandler Executor.initialize (); ส่งคืนผู้บริหาร; } @Override สาธารณะ asyncuncaughtexceptionhandler getasyncuncuncaughtexceptionhandler () {// การจัดการข้อยกเว้นในงานอะซิงโครนัสส่งคืน asyncuncunchexceptionhandler ใหม่ () {@Override void handlecaughtexception log.error ("=========================================================================================================================== - - - - - - เมื่อใช้งานเพียงเพิ่ม @async ลงในวิธีการ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น