ก่อนที่จะใช้สปริงบูตวิธีการของเราคือการกำหนดพูลงานในไฟล์การกำหนดค่าจากนั้นโยนงาน @async คำอธิบายประกอบลงในพูลงานเพื่อดำเนินการ ดังนั้นในการบูตฤดูใบไม้ผลิวิธีการใช้งานการเรียกใช้แบบอะซิงโครนัสวิธีการนั้นง่ายกว่า
มารวมกันก่อนหน้านี้
Spring Boot Integrated JMS (การใช้งาน Activemq)
รหัสในบล็อกนี้ถูกนำไปใช้
1. คำอธิบายฟังก์ชั่น
เมื่อผู้บริโภครับฟังข้อความในคิวเขาหรือเธอประมวลผลงานที่ได้รับข้อความเป็นงานอะซิงโครนัส
2. การปรับเปลี่ยนรหัส
ผู้บริโภค 1:
แพ็คเกจ com.chhliu.springboot.jms; นำเข้า org.springframework.jms.annotation.jmslistener; นำเข้า org.springframework.scheduling.annotation.async; นำเข้า org.springframework.stereotype.component; @component คลาสสาธารณะผู้บริโภค {@jmslistener (ปลายทาง = "mytest.queue") @async // วิธีนี้จะดำเนินการแบบอะซิงโครนัสซึ่งหมายความว่าเธรดหลักจะข้ามวิธีการโดยตรง แต่ใช้เธรดในพูล คือ: "+ข้อความ); -ผู้บริโภค 2:
แพ็คเกจ com.chhliu.springboot.jms; นำเข้า org.springframework.jms.annotation.jmslistener; นำเข้า org.springframework.messaging.handler.annotation.sendto; นำเข้า org.springframework.stereotype.component; @component คลาสสาธารณะคลาส Consumer2 {@jmslistener (ปลายทาง = "mytest.queue") @sendto ("out.queue") สตริงสาธารณะรับ (ข้อความสตริง) {system.out.println (thread.currentthread () getName ()+": ข้อความที่ได้รับ ส่งคืน "ส่งคืนข้อความ"+ข้อความ; -เพิ่มคำอธิบายประกอบต่อไปนี้ในคลาสทดสอบ:
แพ็คเกจ com.chhliu.springboot.jms; นำเข้า Javax.jms.destination; นำเข้า 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) @springboottest @enableasync // เปิดใช้งานงานแบบอะซิงโครนัสเพื่อสนับสนุนคลาสสาธารณะ SpringbootjmsapplicationTests {@autowired Private Producer; @Test void contextloads () พ่น InterruptedException {ปลายทางปลายทาง = ใหม่ activeMqqueue ("mytest.queue"); สำหรับ (int i = 0; i <100; i ++) {producer.sendMessage (ปลายทาง, "myname คือ Chhliu !!!"); - 3. ผลการทดสอบ
DefaultMessageListenerContainer-1: Consumer2 ได้รับ: MyName Is Chhliu !!! ข้อความตอบกลับที่ได้รับจากคิว out.queue คือ: ส่งคืน Messagemyname คือ Chhliu !!! Simpleasynctaskexecutor-45: ข้อความที่ได้รับจากผู้บริโภคคือ: myname คือ Chhliu !!! DefaultMessageListenerContainer-1: Consumer2 ได้รับ: MyName Is Chhliu !!! ข้อความตอบกลับที่ได้รับจากคิว out.queue คือ: ส่งคืน Messagemyname คือ Chhliu !!! Simpleasynctaskexecutor-46: ข้อความที่ได้รับจากผู้บริโภคคือ: myname คือ Chhliu !!! DefaultMessAgelistenerContainer-1: ข้อความที่ได้รับจากผู้บริโภค 2 คือ: myname คือ Chhliu !!! ข้อความตอบกลับที่ได้รับจากคิว out.queue คือ: ส่งคืน Messagemyname คือ Chhliu !!! Simpleasynctaskexecutor-47: ข้อความที่ได้รับจากผู้บริโภคคือ: myname คือ Chhliu !!! DefaultMessAgelistenerContainer-1: ข้อความที่ได้รับจากผู้บริโภค 2 คือ: myname คือ Chhliu !!! ข้อความตอบกลับที่ได้รับจากคิว out.queue คือ: ส่งคืน Messagemyname คือ Chhliu !!! Simpleasynctaskexecutor-48: ข้อความที่ได้รับจากผู้บริโภคคือ: myname คือ Chhliu !!! DefaultMessAgelistenerContainer-1: Consumer2 คือ: MyName is Chhliu !!! ข้อความตอบกลับที่ได้รับจากคิว out.queue คือ: ส่งคืน Messagemyname คือ Chhliu !!! Simpleasynctaskexecutor-49: ข้อความที่ได้รับจากผู้บริโภคคือ: myname คือ Chhliu !!! DefaultMessAgelistenerContainer-1: ข้อความที่ได้รับจากผู้บริโภค 2 คือ: myname คือ Chhliu !!! ข้อความตอบกลับที่ได้รับจากคิว out.queue คือ: ส่งคืน Messagemyname คือ Chhliu !!! Simpleasynctaskexecutor-50: ข้อความที่ได้รับจากผู้บริโภคคือ: myname คือ Chhliu !!! DefaultMessAgelistenerContainer-1: ข้อความที่ได้รับจากผู้บริโภค 2 คือ: myname คือ Chhliu !!!
จากผลการทดสอบข้างต้นเราจะเห็นได้ว่าเนื่องจากผู้บริโภค 2 ไม่ได้ใช้วิธีการงานแบบอะซิงโครนัสผู้บริโภค 2 ใช้ข้อความจะถูกประมวลผลโดยเธรดเริ่มต้นที่คงที่ MessageListenerContainer-1 ผู้บริโภค 1 ใช้วิธีการงานแบบอะซิงโครนัสและทุกครั้งที่ข้อความที่ได้รับจะถูกประมวลผลโดยเธรดที่แตกต่างกัน เมื่อได้รับข้อความงานจะถูกโยนลงในพูลงานโดยตรงเพื่อประมวลผลและเธรดหลักยังคงทำงานต่อไป นอกจากนี้ยังสามารถอนุมานได้จากผลการทดสอบที่ Spring Boot ใช้พูลเธรด newcachedthreadpool โดยค่าเริ่มต้น
สำหรับการใช้พูลเธรดเฉพาะโปรดดูโพสต์บล็อกอื่นจากฉัน: //www.vevb.com/article/134870.htm
4. งานอะซิงโครนัสได้กลับมาแล้ว
ในการพัฒนาจริงเรามักจะพบกับสถานการณ์ที่งานอะซิงโครนัสกลับมา แล้วเราจะนำไปใช้ใน Spring Boot ได้อย่างไร?
ต่อไปนี้เป็นตัวอย่างของการส่งอีเมลแบบอะซิงโครนัสเป็นคำอธิบาย รหัสตัวอย่างมีดังนี้:
@async ("taskexecutepool") // งานอะซิงโครนัสจะถูกส่งไปยังพูลงาน taskexecutepool เพื่อดำเนินการในอนาคตสาธารณะ <sersions> Desendemail (MailInfo MailInfo) วิธีการแบบอะซิงโครนัส Dosendemail ถูกเรียก! "); SendMailSession Session = NULL; การตอบสนอง res = การตอบกลับใหม่ (); บูลีน isok = sendemail (mailInfo); // วิธีการเฉพาะในการส่งอีเมลถ้า (isok) {res.setsuccess (จริง); } else {res.setsuccess (เท็จ); } ส่งคืน asyncresult ใหม่ <s Response> (res);จะใช้อย่างไรหลังจากกลับมา? รหัสตัวอย่างมีดังนี้:
อนาคต <Sumplement> result = taskJob.DosendEmail (MailInfo); res = result.get (6, TimeUnit.seconds);
วิธีนี้คุณจะได้รับการกลับมาของงานอะซิงโครนัส!
สรุป
ข้างต้นเป็นวิธีการใช้งานของการกำหนดเวลางานสปริงบูตแบบอะซิงโครนัส (Async) แนะนำให้คุณรู้จัก ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!