في المدونة السابقة ، 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 ؛ خاص int maxpoolsize. int int keepaliveseconds ؛ private int queuecapacity ؛ ……… حذف getter ، طريقة setter ………} حزمة 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 private TaskThReadPoolConfig config ؛ Bean Public Executor MyTaskAsyncPool () {threadpooltaskexecutor eventor = new threadpooltaskexecutor () ؛ Executor.setCorePoolSize (config.getCorePoolSize ()) ؛ Executor.setMaxPoolSize (config.getMaxPoolsize ()) ؛ Executor.SetQueUeCapacity (config.getqueUeCapacity ()) ؛ Executor.SetKeepalivesEconds (config.getKeepaliveSeconds ()) ؛ Executor.SetThReadNamePrefix ("MyExecutor-") ؛ // الرفض-السياسة: كيفية التعامل مع المهام الجديدة عندما يصل المسبح إلى أقصى الحجم // caller_runs: لا تنفذ المهام في الخيط الجديد ، ولكن تنفيذ Executor.SetRejectedExecutionHandler (ThreadPoolexecutor.CallerRunspolicy ()) ؛ 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 ؛ springBOOTAPPLICATIONENABLEASYNCENABLECONFIGURITYPROPERTIES ({TaskThReadPoolConfig.class}) // تمكين خصائص التكوين لدعم الفئة العامة springbootasyncapplication {public static void main (string [] }} حزمة com.chhliu.springboot.async.pool ؛ استيراد org.slf4j.logger ؛ استيراد org.slf4j.loggerfactory ؛ استيراد org.springframework.scheduling.annotation.async ؛ استيراد org.springframework.stereotype.component ؛ component public class asynctask {protected final logger logger = loggerFactory.getLogger (this.getClass ()) ؛ async ("MyTaskAsyncpool") // MyTaskAsyncPool هو اسم الطريقة لتكوين تجمع مؤشرات الترابط. إذا لم تكتب اسم طريقة تجمع مؤشرات الترابط المخصص هنا ، فسيتم استخدام مجموعة مؤشرات الترابط الافتراضية dotask1 (int i) رميات interruptedException {logger.info ("Task"+i+"chation.") ؛ }} حزمة 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 logger = loggerfactory.getLogger (this.getClass ()) ؛ AUTOWIRED الخاص ASYNCTASK ASYNCTASK ؛ Test public void asynctasktest () يلقي InterruptedException ، 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.reflect.method ؛ استيراد java.util.concurrent.executor ؛ استيراد java.util.concurrent.threadpoolexecutor ؛ استيراد org.springframework.aop.Interceptor.AsyncuncaughtexceptionHandler ؛ استيراد 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 AM * @version 1.2.0 */ @slf4jconfiguration class public class. AutOwired Private TaskThReadPoolConfig config ؛ // لتكوين فئة الخصائص ، راجع الكود أعلاه Override Public GetasyNcexecutor () {threadpooltaskexecutor executor = new threadpooltaskexecutor () ؛ Executor.setCorePoolSize (config.getCorePoolSize ()) ؛ Executor.setMaxPoolSize (config.getMaxPoolsize ()) ؛ Executor.SetQueUeCapacity (config.getqueUeCapacity ()) ؛ Executor.SetKeepalivesEconds (config.getKeepaliveSeconds ()) ؛ Executor.SetThReadNamePrefix ("taskexecutor-") ؛ // الرفض-السياسة: كيفية التعامل مع المهام الجديدة عندما يصل المجمع إلى أقصى الحجم // caller_runs: لم يتم تنفيذ المهمة في مؤشر الترابط الجديد ، ولكن الخيط الذي يوجد فيه المتصل ينفذ executor.setRejectedExecutionHandler (new threadpoolexecutor.callerrunspolicy ()) ؛ Executor.Initialize () ؛ إرجاع المنفذ ؛ } Override Public AsyncunCaughtexceptionHandler getAsyNcunCaughtexceptionHandler () {// استثناء معالجة في المهام غير المتزامنة إرجاع asyncuncaughtexceptionHandler () log.error ("================================================================================================================================================== ========================================================== =========================================================== ========================================================== =========================================================== ========================================================== =========================================================== عند استخدامه ، ما عليك سوى إضافة async إلى الطريقة.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.