في الآونة الأخيرة ، واجهت شرطًا ، وهو أنه عندما يتلقى الخادم طلبًا ، فإنه لا يتطلب إكمال تنفيذ المهمة قبل إرجاع النتيجة. يمكن أن تُرجع النتيجة على الفور وترك المهمة تنفذ بشكل غير متزامن. أول شيء يجب مراعاته هو بدء مؤشر ترابط جديد لتنفيذ المهمة أو إرسال المهمة إلى مجموعة مؤشرات الترابط للتنفيذ. كلتا الطريقتين على ما يرام. لكن الربيع قوي للغاية ، يجب أن تكون هناك طريقة أبسط. أنا فقط غوغدها وهو حقا. ما عليك سوى استخدام اثنين من التعليقات التوضيحية enableAsync و async لتكون موافق.
إضافة async التعليق التوضيحي إلى الطريقة
package me.deweixu.aysncdemo.service ؛ واجهة عامة asyncservice {void asyncmethod (string arg) ؛} package me.deweixu.aysncdemo.service.ipml ؛ import me.deweixu.aysncdemo.service.asyncservice ؛ import org.springframework AsyncService {Async Override public void asyncmethod (string arg) {system.out.println ("arg:" + arg) ؛ system.out.println ("======" + thread.currentThread (). getName () + "===============) ؛}} enableAsync
إضافة enableAsync التعليق التوضيحي إلى فئة بدء التشغيل أو فئة التكوين
package me.deweixu.aysncdemo ؛ استيراد org.springframework.boot.springapplication ؛ استيراد org.springframework.boot.autoconfigure.springbootapplication ؛ aysncdemoapplication {public static void main (string [] args) {springapplication.run (aysncdemoapplication.class ، args) ؛ }} امتحان
package me.deweixu.aysncdemo ؛ import me.deweixu.aysncdemo.service.asyncservice ؛ import org.junit.test ؛ import org.junit.runner.runwith ؛ import org.springframework.beans.factory.Annotation.Autowired ؛ org.springframework.boot.test.context.springBoottest ؛ استيراد org.springframework.test.context.junit4.springRunner ؛ Runwith (springrunner.class) springboottestpublic ayysncdemoapplicationTests Test public void testasync () {system.out.println ("======" + thread.currentTherThread (). getName () + "======================)=================
2018-03-25 21: 30: 31.391 info 28742 ---
arg: Async
===== SimpleAsynctAskexecutor-1 ==============
من النتائج المذكورة أعلاه ، يتم بالفعل تنفيذ AsyncService.AsyncMethod ("Async") بشكل غير متزامن ، ويستخدم مؤشر ترابط جديد.
حدد المنفذ
من سجل التنفيذ أعلاه ، يمكنك تخمين أن Spring يستخدم SimpleAsynctAskexecutor لتنفيذ المهام بشكل غير متزامن بشكل افتراضي. يمكنك البحث عن هذا الفصل. يمكن لـ ASYNC أيضًا تحديد منفذ مخصص.
أضف منفذاً مخصصًا إلى فئة بدء التشغيل
package me.deweixu.aysncdemo ؛ استيراد org.springframework.boot.springapplication ؛ استيراد org.springframework.boot.autoconfigure.springbootapplication ؛ استيراد org.springframework.context.annotation.bean ؛ استيراد org.springframework.scheduling.annotation.enableAsync ؛ استيراد org.springframework.scheduling.concurrent.threadpooltaskexecutor args) {springapplication.run (aysncdemoapplication.class ، args) ؛ } bean (name = "threadpooltaskexecutor") Public Executor threadpooltaskexecutor () {return new threadpooltaskexecutor () ؛ }}حدد المنفذ
package me.deweixu.aysncdemo.service.ipml ؛ import me.deweixu.aysncdemo.service.asyncservice ؛ import org.springframework AsyncService {Async ("threadpooltaskexecutor") Override public void asyncmethod (string arg) {system.out.println ("arg:" + arg) ؛ system.out.println ("======" + thread.currentTheread ().وبهذه الطريقة ، استخدم threadpooltaskexecutor عند تنفيذ المهام بشكل غير متزامن
قم بتعيين المنفذ الافتراضي
كما هو مذكور أعلاه ، إذا لم يحدد ASYNC المنفذ ، فسيتم استخدام SimpleAsyNctAskexecutor افتراضيًا. في الواقع ، يمكن تكوين المنفذ الافتراضي باستخدام واجهة AsyncConfigurer.
class class springasyncconfig تنفذ asyncconfigurer {Override Public Executor getasyncexecutor () {return new threadpooltaskexecutor () ؛ }} استثناء التقاط
قد تحدث الاستثناءات في طرق التنفيذ غير المتزامنة. يمكننا استخدام محاولة التقاط داخل المهمة للتعامل مع الاستثناءات. عندما ترمي المهمة استثناء ، يوفر Spring أيضًا طريقة للقبض عليه.
قم بتنفيذ واجهة asyncuncaughtexceptionhandler
الطبقة العامة CustomAsyNceSceptionHandler تنفذ asyncuncaughtexceptionHandler {Override public void handleuncaughtexception (قابلة للتسمية ، طريقة ، الكائن ... obj) {system.out.println ("رسالة استثناء -" + throwable.getMessage ()) ؛ System.out.println ("method name -" + method.getName ()) ؛ لـ (Object param: obj) {system.out.println ("parameter value -" + param) ؛ }}}قم بتنفيذ طريقة AsyncConfigurer Interface Rewrite getAsyncuncaughtexceptionler
class class springasyncconfig تنفذ asyncconfigurer {Override Public Executor getasyncexecutor () {return new threadpooltaskexecutor () ؛ } Override Public AsyncunCaughtexceptionHandler getAsyncuncaughtexceptionHandler () {return New CustomAncexceptionHandler () ؛ }}أعد كتابة طريقة asyncmethod لجعلها ترمي استثناء
asyncoverride public void asyncmethod (string arg) {system.out.println ("arg:" + arg) ؛ System.out.println ("======" + thread.currentTheread (). getName () + "================)نتائج التشغيل:
=================
arg: Async
====== ThreadPooltAskexecutor-1 =============
رسالة استثناء - Async nullpointerxception
اسم الطريقة - Asyncmethod
قيمة المعلمة - Async
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.