في SPRING BOOT (Spring MVC) ، تتم مزامنة الطلبات افتراضيًا. الخيط مسؤول عن الماضي ونهاية الطلب. في كثير من الحالات ، من أجل تحسين الإنتاجية ، يجب أن تكون بعض العمليات غير متزامنة. بالإضافة إلى بعض منطق الأعمال المستهلكة للوقت الذي يمكن أن يكون غير متزامن ، يمكن أيضًا تنفيذ واجهة الاستعلام الخاصة بنا بشكل غير متزامن.
يتم استلام طلب إلى الخدمة بواسطة مؤشر ترابط من حاوية ويب ، مثل مؤشر الترابط HTTP-NIO-8084-EXEC-1
يمكننا استخدام WebAsynctask لتوزيع هذا الطلب على مؤشر ترابط جديد للتنفيذ ، ويمكن أن يتلقى HTTP-NIO-8084-EXEC-1 معالجة الطلبات الأخرى. بمجرد إرجاع WebAsynctask البيانات ، سيتم استدعاؤها ومعالجتها مرة أخرى ، وسيتم إرجاع القيمة إلى الجانب طلب بطريقة غير متزامنة.
رمز العينة كما يلي:
requestmapping (value = "/login" ، method = requestMethod.get) public webasynctask <DomplandView> longtimetask () {system.out.println ("/login يسمى معرف مؤشر الترابط هو: callable <DomplandView> callable = new callable <DomplandView> () {public modelandview call () rems {thread.sleep (1000) ؛ /محاكاة المهام طويلة الأجل ModelandView Mav = New ModelAndView ("تسجيل الدخول/الفهرس") ؛ system.out.println ("تنفيذ معرف مؤشر الترابط الناجح هو:" + thread.currentThRead (). getName ()) ؛ إرجاع ماف. }} ؛ إرجاع webasynctask جديد <ModelandView> (callable) ؛}يمكنك رؤية نتيجة الإخراج على النحو التالي:
/تسجيل الدخول يسمى معرف الموضوع هو: http-nio-8084-exec-1
التنفيذ بنجاح معرف الخيط هو: mvcasync1
الخيط قبل تنفيذ منطق العمل والخيط الذي يتعامل على وجه التحديد مع منطق العمل ليس هو نفسه ، وهو ما يحقق هدفنا.
ثم أجريت اختبارًا متزامنًا ووجدت أنني كنت أقوم باستمرار بإنشاء موضوع MVCASYNC1. كنت أفكر ، أليس كذلك تجمع الخيوط المستخدمة؟
بعد قراءة رمز المصدر ، وجدت أن هذا صحيح. WebasyncManager هي الفئة المركزية لـ Spring MVC لإدارة المعالجة ASYNC.
الافتراضي هو استخدام SimpleAsynctAskexecutor ، والذي سيقوم بإنشاء مؤشر ترابط جديد لكل طلب.
خاص asynctaSkexecutor taskexecutor = جديد simpleasynctaSkexecutor (this.getClass (). getSimplename ()) ؛
إذا كانت المهمة تحدد المنفذ ، فاستخدم المهمة تحددها. إذا لم يحدث ذلك ، فاستخدم SimpleAsynctAskexecutor الافتراضي
asynctaskexecutor executor = webasynctask.getExecutor () ؛ if (Executor! = null) {this.taskexecutor = executor ؛}يمكننا تكوين تجمع مؤشرات ترابط ASYNC دون تحديده بشكل منفصل لكل مهمة
حدد بواسطة configurer.settAskexecutor (ThreadPoolTaskexecutor ()) ؛
استيراد org.springframework.context.annotation.bean ؛ استيراد org.springframework.context.annotation.configuration ؛ استيراد org.springframework.scheduling.concurrent.threadpooltaskexecutor ؛ استيراد org.springframework.web.context.request.async.TimeOutCallableProcessingInterceptor ؛ استيراد org.springframework.web.servlet.config.annotation.asyncsupportconfigurer ؛ استيراد org.springframework.web.servlet.config.annotation.webmvcConfigurationSupport ؛ configurationpublic class webmvcconfig 1000L) ؛ configurer.registerCallableInterceptors (timeOutInterceptor ()) ؛ configurer.settaskexecutor (threadpooltaskexecutor ()) ؛ } bean public timeOutCallableProcessingInterceptor timeoutinterceptor () {return new timeOutCallableProcessingInterceptor () ؛ } bean public threadpooltaskexecutor threadpooltaskexecutor () {threadpooltaskexecutor t = new threadpooltaskexecutor () ؛ T.SetCorePoolsize (10) ؛ T.SetMaxPoolsize (50) ؛ T.SetThReadNamePrefix ("yjh") ؛ العودة ر ؛ }}بعد التكوين ، يمكنك أن ترى أن اسم مؤشر ترابط الإخراج يبدأ بـ YJH ، ولن يتم إنشاء مؤشرات الترابط الجديدة طوال الوقت.
يمكنك رؤية نتيجة الإخراج على النحو التالي:
/تسجيل الدخول يسمى معرف مؤشر الترابط هو: HTTP-NIO-8084-EXEC-1 تنفيذ معرف مؤشر الترابط هو: YJH1
لخص
ما ورد أعلاه هو ما الذي قدمه المحرر إلى Spring Boot يستخدم WebasyNctask لإرجاع النتائج بشكل غير متزامن. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!