قبل استخدام Spring Boot ، كان نهجنا هو تحديد تجمع المهام في ملف التكوين ، ثم رمي المهمة المشروحة ASYNC في تجمع المهام للتنفيذ. لذلك في SPRING BOOT ، كيفية تنفيذ مكالمات المهام غير المتزامنة ، تكون الطريقة أبسط.
لنجمع بين السابق
SPRING BOOT المتكامل JMS (ActiveMQ تطبيق)
يتم تنفيذ الرمز في هذه المدونة.
1. وصف الوظيفة
عندما يستمع المستهلك إلى رسالة في قائمة الانتظار ، فإنه يعالج المهمة التي تتلقى الرسالة كمهمة غير متزامنة.
2. تعديل الكود
المستهلك 1:
حزمة com.chhliu.springboot.jms ؛ استيراد org.springframework.jms.annotation.jmslistener ؛ استيراد org.springframework.scheduling.annotation.async ؛ استيراد org.springframework.stereotype.component ؛ component class public classe {jmslistener (destination = "mytest.queue") async // سيتم تنفيذ هذه الطريقة بشكل غير متزامن ، مما يعني أن الخيط الرئيسي سيخطي الطريقة مباشرة ، ولكن استخدم مؤشر الترابط في سلسلة مؤشرات الترابط (getName) "+نص) ؛ }}المستهلك 2:
حزمة com.chhliu.springboot.jms ؛ استيراد org.springframework.jms.annotation.jmslistener ؛ استيراد org.springframework.messaging.handler.annotation.sendto ؛ استيراد org.springframework.stereotype.component ؛ Component Public Class Consumer2 {jmsListener (destination = "mytest.queue") sendto ("out.queue") سلسلة public recequeue (نص سلسلة) {system.out.println (thread.currentThRead (). getName ()+": الرسالة المستلمة من قبل المستهلك هي: إرجاع "رسالة الإرجاع"+النص ؛ }}أضف التعليق التوضيحي التالي إلى فئة الاختبار:
حزمة com.chhliu.springboot.jms ؛ استيراد javax.jms.dest. استيراد org.apache.activemq.command.activemqqueue ؛ استيراد org.junit.test ؛ استيراد org.junit.runner.runwith ؛ استيراد org.springframework.beans.factory.annotation.autowired ؛ استيراد org.springframework.boot.test.context.springBoottest ؛ استيراد org.springframework.scheduling.annotation.enableAsync ؛ استيراد org.springframework.test.context.junit4.springRunner ؛ Runwith (SpringRunner.Class) springBOOTTESTENTABLEASYNC // تمكين المهام غير المتزامنة لدعم SPRINGBOOTJMSAPPLICATIONTSTS {Autowired Producer Producer ؛ Test public void contextloads () يلقي interruptedException {Destination = new ActiveMqQueue ("mytest.queue") ؛ لـ (int i = 0 ؛ i <100 ؛ i ++) {producer.SendMessage (الوجهة ، "myName is chhliu !!!") ؛ }}} 3. نتائج الاختبار
DefaultMessageListenerContainer-1: يستقبل المستهلك: myName هو chhliu !!! رسالة الرد المستلمة من Out.queue Queue هي: Return MessageMyname is Chhliu !!! SimpleAsynctAskexecutor-45: الرسالة التي يتلقاها المستهلك هي: MyName is chhliu !!! DefaultMessageListenerContainer-1: يستقبل المستهلك: myName هو chhliu !!! رسالة الرد المستلمة من Out.queue Queue هي: Return MessageMyname is Chhliu !!! SimpleAsynctAskexecutor-46: الرسالة التي يتلقاها المستهلك هي: MyName is chhliu !!! DefaultMessageListenerContainer-1: الرسالة التي تلقاها المستهلك 2 هي: myName is chhliu !!! رسالة الرد المستلمة من Out.queue Queue هي: Return MessageMyname is Chhliu !!! SimpleAsynctAskexecutor-47: الرسالة التي يتلقاها المستهلك هي: MyName is chhliu !!! DefaultMessageListenerContainer-1: الرسالة التي تلقاها المستهلك 2 هي: myName is chhliu !!! رسالة الرد المستلمة من Out.queue Queue هي: Return MessageMyname is Chhliu !!! SimpleAsynctAskexecutor-48: الرسالة التي يتلقاها المستهلك هي: MyName is chhliu !!! DefaultMessageListenerContainer-1: Consumer2 هو: myName هو chhliu !!! رسالة الرد المستلمة من Out.queue Queue هي: Return MessageMyname is Chhliu !!! SimpleAsynctAskexecutor-49: الرسالة التي يتلقاها المستهلك هي: MyName is chhliu !!! DefaultMessageListenerContainer-1: الرسالة التي تلقاها المستهلك 2 هي: myName is chhliu !!! رسالة الرد المستلمة من Out.queue Queue هي: Return MessageMyname is Chhliu !!! SimpleAsynctAskexecutor-50: الرسالة التي يتلقاها المستهلك هي: MyName is chhliu !!! DefaultMessageListenerContainer-1: الرسالة التي تلقاها المستهلك 2 هي: myName is chhliu !!!
من نتائج الاختبار المذكورة أعلاه ، يمكننا أن نرى أنه نظرًا لأن المستهلك 2 لا يستخدم طريقة المهمة غير المتزامنة ، فإن المستهلك 2 يستهلك الرسائل من خلال مؤشر الترابط الثابت DefaultMessageListenerContainer-1. يستخدم المستهلك 1 طريقة المهمة غير المتزامنة ، وفي كل مرة تتم معالجة الرسالة المستلمة بواسطة مؤشر ترابط مختلف. عند استلام الرسالة ، يتم إلقاء المهمة مباشرة في مجموعة المهام للمعالجة ، ويستمر المشروع الرئيسي في التشغيل. يمكن أيضًا استنتاجها من نتائج الاختبار التي يستخدمها SPRING BOOT مجمع مؤشرات ترابط NewCacheDTREADPOOL بشكل افتراضي.
للحصول على استخدام محدد لتجمعات سلسلة الرسائل ، يرجى الرجوع إلى منشور آخر في مدونة مني: //www.vevb.com/article/134870.htm
4. عادت المهام غير المتزامنة
في التطور الفعلي ، نواجه غالبًا مواقف تعود فيها المهام غير المتزامنة. فكيف ننفذها في حذاء الربيع؟
فيما يلي مثال على إرسال البريد الإلكتروني غير المتزامن كوصف. رمز المثال هو كما يلي:
async ("taskexecutepool") // سيتم إرسال المهمة غير المتزامنة إلى مجموعة المهام taskexecutepool لتنفيذ المستقبل العام <reponse> dosendemail (mailInfo mailInfo) {// تعود المهمة غير المتزامنة ، واستخدم المستقبل <R. تم استدعاء طريقة dosendemail غير المتزامنة! ") ؛ SendMailsession Session = NULL ؛ استجابة الدقة = استجابة جديدة () ؛ Boolean isok = sendemail (mailInfo) ؛ // الطريقة المحددة لإرسال رسائل البريد الإلكتروني إذا (isok) {res.SetSuccess (true) ؛ } آخر {res.SetSuccess (false) ؛ } إرجاع Asyncresult <S reponse> (الدقة) ؛كيفية استخدامه بعد العودة؟ رمز العينة كما يلي:
مستقبل <RESPLIST> النتيجة = taskjob.dosendemail (mailInfo) ؛ res = result.get (6 ، timeUnit.Seconds) ؛
بهذه الطريقة يمكنك الحصول على عودة المهمة غير المتزامنة!
لخص
ما ورد أعلاه هو طريقة تنفيذ SPRING BOOT غير المتزامن (ASYNC) جدولة المهمة المقدمة لك. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!