في المدونة السابقة ، http://www.vevb.com/article/134866. في ذلك الوقت ، استخدمنا مجموعة مؤشرات الترابط الافتراضية ، ولكن إذا أردنا تخصيص تجمع مؤشرات الترابط الخاص بنا وفقًا للمشروع ، فلنتحدث عن كيفية تخصيص تجمع الخيوط!
1. إضافة فئة سمة التكوين
حزمة 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 ………}2. قم بإنشاء تجمع خيوط
حزمة 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 () ؛ إرجاع المنفذ ؛ }}3. تمكين دعم التكوين في الفئة الرئيسية
حزمة 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-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 بدأ.
نتائج الاختبار على ما يرام!
6. تكوين تجمع مؤشرات الترابط الافتراضي
إذا كنا نريد استخدام تجمع مؤشرات الترابط الافتراضي ، ولكن نريد فقط تعديل تكوين تجمع مؤشرات الترابط الافتراضي ، فماذا يجب أن نفعل؟ في هذا الوقت ، نحتاج إلى تنفيذ فئة 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 إلى الطريقة.
لخص
ما سبق هو ما قدمه لك المحرر. يستخدم SPRING BOOT تجمع مؤشرات ترابط مخصص لأداء مهام ASYNC. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!