مقدمة
تقدم هذه المقالة بشكل أساسي المحتوى ذي الصلة حول دعوة SPRING Boot Integration غير المتزامنة إلى ASYNC. يتم مشاركته للرجوع إليه وتعلمك. لن أقول الكثير أدناه ، دعنا نلقي نظرة على المقدمة التفصيلية معًا.
ما هي المكالمة غير المتزامنة؟
المكالمات غير المتزامنة نسبة إلى المكالمات المتزامنة. تشير المكالمات المتزامنة إلى البرنامج الذي يتم تنفيذه خطوة بخطوة بترتيب محدد مسبقًا. يجب تنفيذ كل خطوة حتى يتم تنفيذ الخطوة السابقة. لا تحتاج المكالمات غير المتزامنة إلى انتظار تنفيذ البرنامج السابق.
طريقة المعالجة غير المتزامنة
كيفية تنفيذ المكالمات غير المتزامنة؟
Multithreading هي كلمة رئيسية يفكر بها الكثير من الناس في البداية. نعم ، Multithreading هي وسيلة لتنفيذ المكالمات غير المتزامنة.
في المشاريع غير الربيع ، نريد تنفيذ المكالمات غير المتزامنة هو استخدام طرق متعددة الخيوط ، يمكننا تنفيذ الواجهة القابلة للتشغيل بأنفسنا أو دمج فئة مؤشرات الترابط ، أو استخدام تجمع مؤشرات الترابط المنفذين المقدم من JDK1.5 أو أعلى.
يوفر Strngboot طريقة مريحة للغاية لتنفيذ المكالمات غير المتزامنة.
اتبع المثال الرسمي
أدخل الرمز
تبعيات مافن:
<Arnal> <roupl> org.springframework.boot </groupId> <intifactid> spring-boot-starter-parent </shintifactid> <sophy> 1.5.3 <StifactId> Spring-Boot-Starter-Web </stifactid> </reperence> </perendencies>
ابدأ الفصل: إضافة enableasync
springBOOTAPPLICATION enableAsync application {public static void main (string [] args) {springapplication.run (application.class ، args) ؛ }}وحدة تحكم
فقط أضف async التعليق التوضيحي على الطريقة التي تحتاجها لتنفيذها بشكل غير متزامن
RestController @REquestMapping ("") الفئة العامة ASYNCTASKCONTROLLER {REQUESTMAPPE (") السلسلة العامة dotask () remruptedException {long currentimeMillis = System.CurrentTimeMillis () ؛ this.task1 () ؛ this.task2 () ؛ this.task3 () ؛ currentTimEmillis1 = System.CurrentTimeMillis () ؛ إرجاع "إجمالي مهمة المهمة المستهلكة:"+(CurrentTimeMillis1-CurrentTimeMillis)+"MS" ؛ } async public void task1 () رميات interruptedException {long currentTimEmillis = System.CurrentTimeMillis () ؛ thread.sleep (1000) ؛ currentTimEmillis1 = System.CurrentTimeMillis () ؛ System.out.println ("Task1 Task Time المستهلكة:"+(CurrentTimEmillis1-CurrentTimeMillis)+"MS") ؛ } async public void task2 () رميات interruptedException {long currentTimeMillis = System.CurrentTimeMillis () ؛ thread.sleep (2000) ؛ currentTimEmillis1 = System.CurrentTimeMillis () ؛ System.out.println ("Task2 Task Consuming:"+(CurrentTimeMillis1-CurrentTimeMillis)+"MS") ؛ } async public void task3 () رميات interruptedException {long currentTimeMillis = System.CurrentTimeMillis () ؛ thread.sleep (3000) ؛ currentTimEmillis1 = System.CurrentTimeMillis () ؛ System.out.println ("Task3 Task Consuming:"+(CurrentTimeMillis1-CurrentTimeMillis)+"MS") ؛ }}الوظيفة الرئيسية تدير مشروع spiRngboot. بعد الانتهاء من بدء التشغيل ، يصل المتصفح إلى: http: // localhost: 8080/
وحدة التحكم:
Task1 وقت المهمة: 1012ms Task2 وقت المهمة: 2009 MSS Task3 وقت المهمة: 3004ms
بعد الانتظار لفترة من الوقت ، يتم إدخال الإخراج:
إجمالي وقت المهمة: 6002 مللي ثانية
غير متزامن لم ينفذ!
هل يمكن أن يكون الكود مكتوبًا بشكل غير صحيح؟ راجعت ذلك عدة مرات ولم أجد أي أخطاء واضحة. أتذكر أن الربيع واجه أيضًا مشاكل مماثلة مع التعليق التوضيحي transactional. عندما يقوم الربيع بمسح فئة باستخدام طريقة شرح @transactional ، يتم إنشاء فئة بالوكالة ، وتبدأ فئة الوكيل وتغلق المعاملة. في نفس الفئة ، يتم تنفيذ استدعاء الطريقة في هيئة الفصل ، ولا يمكن لـ Spring اعتراض استدعاء الطريقة هذه.
فجأة ، ضع المهمة غير المتزامنة في فئة بشكل منفصل ، وضبط الكود لإدخال:
وحدة تحكم
requestmapping ("") @RestController الفئة العامة AsynctaskController {Auutowired private asynctask asynctask ؛ requestmapping ("") السلسلة العامة dotask () يلقي interruptedException {long currentItimEmillis = System.CurrentTimeMillis () ؛ asynctask.task1 () ؛ asynctask.task2 () ؛ asynctask.task3 () ؛ currentTimEmillis1 = System.CurrentTimeMillis () ؛ إرجاع "مهمة المهمة الإجمالية للوقت:"+(CurrentTimeMillis1-CurrentTimeMillis)+"MS" ؛ }} فئة المهام غير المتزامنة
@component public class asynctask {Async public void task1 () remrows interruptedException {long currentTimeMillis = System.CurrentTimeMillis () ؛ thread.sleep (1000) ؛ currentTimEmillis1 = System.CurrentTimeMillis () ؛ System.out.println ("Task1 Task Consuming:"+(CurrentTimeMillis1-CurrentTimeMillis)+"MS") ؛ } async public void task2 () رميات interruptedException {long currentTimeMillis = System.CurrentTimeMillis () ؛ thread.sleep (2000) ؛ currentTimEmillis1 = System.CurrentTimeMillis () ؛ System.out.println ("Task2 Task Consuming:"+(CurrentTimeMillis1-CurrentTimeMillis)+"MS") ؛ } async public void task3 () رميات interruptedException {long currentTimeMillis = System.CurrentTimeMillis () ؛ thread.sleep (3000) ؛ currentTimEmillis1 = System.CurrentTimeMillis () ؛ System.out.println ("Task3 Task Consuming:"+(CurrentTimeMillis1-CurrentTimeMillis)+"MS") ؛ }}وحدة التحكم:
Task1 وقت المهمة: 1012ms Task2 وقت المهمة: 2009 MSS Task3 وقت المهمة: 3004ms
أدخل نتائج المتصفح:
إجمالي وقت المهمة: 19ms
نجحت المكالمة غير المتزامنة!
كيف تعرف متى يتم تنفيذ المهام الثلاثة غير المتزامنة وما هي نتائج التنفيذ؟ يمكنك استخدام طريقة إضافة رد اتصال النحرة للحكم
تم إدخال الرمز:
فئة المهام غير المتزامنة
@Component Public Class Asynctask {Async Public Future <string> Task1 () يلقي InterruptedException {long currentTimeMillis = System.CurrentTimeMillis () ؛ thread.sleep (1000) ؛ currentTimEmillis1 = System.CurrentTimeMillis () ؛ System.out.println ("Task1 Task Consuming:"+(CurrentTimeMillis1-CurrentTimeMillis)+"MS") ؛ إرجاع Asyncresult <Tring> الجديد ("تم الانتهاء من تنفيذ Task1") ؛ } async public future <string> task2 () remrows interruptedException {long currentTimEmillis = System.CurrentTimeMillis () ؛ thread.sleep (2000) ؛ currentTimEmillis1 = System.CurrentTimeMillis () ؛ System.out.println ("Task2 Task Consuming:"+(CurrentTimeMillis1-CurrentTimeMillis)+"MS") ؛ إرجاع Asyncresult <Tring> الجديد ("تم الانتهاء من تنفيذ Task2") ؛ } async public future <string> task3 () remrows interruptedException {long currentimeMillis = System.CurrentTimeMillis () ؛ thread.sleep (3000) ؛ currentTimEmillis1 = System.CurrentTimeMillis () ؛ System.out.println ("Task3 Task Consuming:"+(CurrentTimeMillis1-CurrentTimeMillis)+"MS") ؛ إرجاع Asyncresult <Tring> الجديد ("تنفيذ Task3 الانتهاء") ؛ }} وحدة تحكم
requestmapping ("") @RestController الفئة العامة AsynctaskController {Auutowired private asynctask asynctask ؛ requestmapping ("") السلسلة العامة dotask () يلقي interruptedException {long currentItimEmillis = System.CurrentTimeMillis () ؛ المستقبل <string> task1 = asynctask.task1 () ؛ المستقبل <string> task2 = asynctask.task2 () ؛ المستقبل <string> task3 = asynctask.task3 () ؛ نتيجة السلسلة = فارغة ؛ لـ (؛؛) {if (task1.isdone () && task2.isdone () && task3.isdone ()) {// يتم استدعاء جميع المهام الثلاثة لإكمالها ، والخروج من الحلقة وانتظر الفاصل ؛ } thread.sleep (1000) ؛ } long currentItimEmillis1 = System.CurrentTimeMillis () ؛ النتيجة = "إجمالي الوقت المستهلك للمهام:"+(CurrentTimEmillis1-CurrentTimeMillis)+"MS" ؛ نتيجة العودة }}إخراج وحدة التحكم:
Task1 وقت المهمة: 1000ms Task2 وقت المهمة: 2001ms Task3 وقت المهمة: 3001ms
إخراج المتصفح:
إجمالي وقت المهمة: 4015ms
إن المكالمة غير المتزامنة ناجحة ويعيد البرنامج النتيجة فقط عند اكتمال جميع المهام!
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.