คำนำ
บทความนี้ส่วนใหญ่แนะนำเนื้อหาที่เกี่ยวข้องเกี่ยวกับการเรียกแบบอะซิงโครนัสของสปริงบูตการรวมตัวกัน มันถูกแบ่งปันสำหรับการอ้างอิงและการเรียนรู้ของคุณ ฉันจะไม่พูดมากขึ้นด้านล่างลองมาดูการแนะนำรายละเอียดด้วยกัน
การโทรแบบอะซิงโครนัสคืออะไร?
การโทรแบบอะซิงโครนัสสัมพันธ์กับการโทรแบบซิงโครนัส การโทรแบบซิงโครนัสอ้างถึงโปรแกรมที่ดำเนินการทีละขั้นตอนตามลำดับที่กำหนดไว้ล่วงหน้า แต่ละขั้นตอนจะต้องดำเนินการจนกว่าจะดำเนินการขั้นตอนก่อนหน้า การโทรแบบอะซิงโครนัสไม่จำเป็นต้องรอให้โปรแกรมก่อนหน้าดำเนินการ
วิธีการประมวลผลแบบอะซิงโครนัส
จะใช้การโทรแบบอะซิงโครนัสได้อย่างไร?
มัลติเธรดเป็นคำหลักที่หลายคนคิดในตอนแรก ใช่มัลติเธรดเป็นวิธีการใช้การโทรแบบอะซิงโครนัส
ในโครงการที่ไม่ใช่สปริงเราต้องการใช้การโทรแบบอะซิงโครนัสคือการใช้วิธีการหลายเธรดเราสามารถใช้อินเทอร์เฟซที่สามารถเรียกใช้ได้ด้วยตนเองหรือรวมคลาสเธรดหรือใช้พูลเธรดผู้บริหารที่จัดทำโดย JDK1.5 หรือสูงกว่า
Strngboot เป็นวิธีที่สะดวกมากในการเรียกใช้การโทรแบบอะซิงโครนัส
ทำตามตัวอย่างอย่างเป็นทางการ
ป้อนรหัส
การพึ่งพา Maven:
<carent> <roupId> org.springframework.boot </groupid> <ratifactid> Spring-Boot-Starter-Parent </artifactid> <version> 1.5.3.release </เวอร์ชัน> </parent> <ArtIfactId> Spring-Boot-Starter-Web </artifactid> </derdency> </pendencies>
เริ่มคลาส: เพิ่ม @enableasync คำอธิบายประกอบ
@springbootapplication @enableasync แอปพลิเคชันคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (application.class, args); -ผู้ควบคุม
เพียงเพิ่ม @async คำอธิบายประกอบในวิธีที่คุณต้องใช้ในการดำเนินการแบบอะซิงโครนัส
@RestController @RequestMapping ("") คลาสสาธารณะ asynctaskController {@requestmapping ("") Public String Dotask () พ่น InterruptedException {Long CurrentTimeMillis = System.currentTimeMillis (); this.task1 (); this.task2 (); this.task3 (); Long CurftStimeMillis1 = System.currentTimeMillis (); กลับ "งานงานรวมเวลาที่ใช้ไปแล้ว:"+(CurftsTimeMillis1-currentTimeMillis)+"MS"; } @async public void task1 () พ่น InterruptedException {Long CurrentTimeMillis = System.currentTimeMillis (); Thread.sleep (1,000); Long CurftStimeMillis1 = System.currentTimeMillis (); System.out.println ("งาน 1 เวลางานที่ใช้:"+(currentTimeMillis1-currentTimeMillis)+"MS"); } @async public void task2 () พ่น InterruptedException {Long CurrentTimeMillis = System.currentTimeMillis (); Thread.sleep (2000); Long CurftStimeMillis1 = System.currentTimeMillis (); System.out.println ("Task2 Task Tame ใช้เวลานาน:"+(currentTimeMillis1-currentTimeMillis)+"MS"); } @async โมฆะสาธารณะ task3 () พ่น InterruptedException {Long CurrentTimeMillis = System.currentTimeMillis (); Thread.sleep (3000); Long CurftStimeMillis1 = System.currentTimeMillis (); System.out.println ("Task3 งานที่ต้องใช้เวลานาน:"+(currentTimeMillis1-currentTimeMillis)+"MS"); -ฟังก์ชั่นหลักเรียกใช้โครงการ Spirngboot หลังจากเริ่มต้นเสร็จสิ้นเบราว์เซอร์เข้าถึง: http: // localhost: 8080/
คอนโซล:
งาน 1 เวลางาน: 1012ms งาน 2 เวลางาน: 2009ms งาน task3 เวลางาน: 3004ms
หลังจากรอสักครู่แล้วจะป้อนเอาต์พุต:
เวลางานทั้งหมด: 6002ms
ไม่ได้ดำเนินการแบบอะซิงโครนัส!
เป็นไปได้ไหมที่รหัสถูกเขียนไม่ถูกต้อง? ฉันตรวจสอบหลายครั้งและไม่พบข้อผิดพลาดที่ชัดเจน ฉันจำได้ว่าฤดูใบไม้ผลิมีปัญหาคล้ายกันกับคำอธิบายประกอบ @Transactional เมื่อสปริงสแกนคลาสด้วยวิธีการอธิบายประกอบ @Transactional คลาสพร็อกซีจะถูกสร้างขึ้นและคลาสพร็อกซีเริ่มต้นและปิดการทำธุรกรรม ในคลาสเดียวกันการเรียกใช้วิธีการเรียกใช้ในคลาสคลาสและสปริงไม่สามารถสกัดกั้นวิธีการนี้
ทันใดนั้นใส่งานอะซิงโครนัสลงในชั้นเรียนแยกต่างหากและปรับรหัสเพื่อป้อน:
ผู้ควบคุม
@RequestMapping ("") @RestController คลาสสาธารณะ ASYNCTASKCONTROLLER {@AUTOWIRED ส่วนตัว ASYNCTASK ASYNCTASK; @RequestMapping ("") Public String Dotask () พ่น InterruptedException {Long CurrentTimeMillis = System.currentTimeMillis (); asynctask.task1 (); asynctask.task2 (); asynctask.task3 (); Long CurftStimeMillis1 = System.currentTimeMillis (); return "งานงานที่ใช้เวลาทั้งหมด:"+(currenttimeMillis1-currentTimeMillis)+"MS"; - คลาสงานแบบอะซิงโครนัส
@Component คลาสสาธารณะ asynctask {@async public void task1 () พ่น InterruptedException {long currenttimemillis = system.currentTimeMillis (); Thread.sleep (1,000); Long CurftStimeMillis1 = System.currentTimeMillis (); System.out.println ("Task1 งานที่ต้องใช้เวลานาน:"+(currentTimeMillis1-currentTimeMillis)+"MS"); } @async public void task2 () พ่น InterruptedException {Long CurrentTimeMillis = System.currentTimeMillis (); Thread.sleep (2000); Long CurftStimeMillis1 = System.currentTimeMillis (); System.out.println ("Task2 Task Tame ใช้เวลานาน:"+(currentTimeMillis1-currentTimeMillis)+"MS"); } @async โมฆะสาธารณะ task3 () พ่น InterruptedException {Long CurrentTimeMillis = System.currentTimeMillis (); Thread.sleep (3000); Long CurftStimeMillis1 = System.currentTimeMillis (); System.out.println ("Task3 งานที่ต้องใช้เวลานาน:"+(currentTimeMillis1-currentTimeMillis)+"MS"); -คอนโซล:
งาน 1 เวลางาน: 1012ms งาน 2 เวลางาน: 2009ms งาน task3 เวลางาน: 3004ms
ป้อนผลของเบราว์เซอร์:
เวลางานทั้งหมด: 19ms
การโทรแบบอะซิงโครนัสประสบความสำเร็จ!
คุณจะรู้ได้อย่างไรว่างานทั้งสามแบบอะซิงโครนัสถูกดำเนินการและผลลัพธ์ของการดำเนินการคืออะไร? คุณสามารถใช้วิธีการเพิ่มการโทรกลับเพื่อตัดสิน
รหัสถูกป้อน:
คลาสงานแบบอะซิงโครนัส
@component คลาสสาธารณะ Asynctask {@async Public Future <String> task1 () พ่น InterruptedException {Long CurftStimeMillis = System.CurrentTimeMillis (); Thread.sleep (1,000); Long CurftStimeMillis1 = System.currentTimeMillis (); System.out.println ("Task1 งานที่ต้องใช้เวลานาน:"+(currentTimeMillis1-currentTimeMillis)+"MS"); ส่งคืน AsyncResult ใหม่ <String> ("TASK1 การดำเนินการเสร็จสมบูรณ์"); } @async Public Future <String> task2 () พ่น InterruptedException {Long CurrentTimeMillis = System.currentTimeMillis (); Thread.sleep (2000); Long CurftStimeMillis1 = System.currentTimeMillis (); System.out.println ("Task2 Task Tame ใช้เวลานาน:"+(currentTimeMillis1-currentTimeMillis)+"MS"); ส่งคืน AsyncResult ใหม่ <String> ("Task2 Execution เสร็จสมบูรณ์"); } @async Public Future <String> task3 () พ่น InterruptedException {Long CurrentTimeMillis = System.currentTimeMillis (); Thread.sleep (3000); Long CurftStimeMillis1 = System.currentTimeMillis (); System.out.println ("Task3 งานที่ต้องใช้เวลานาน:"+(currentTimeMillis1-currentTimeMillis)+"MS"); ส่งคืน AsyncResult ใหม่ <String> ("TASK3 Execution เสร็จสมบูรณ์"); - ผู้ควบคุม
@RequestMapping ("") @RestController คลาสสาธารณะ ASYNCTASKCONTROLLER {@AUTOWIRED ส่วนตัว ASYNCTASK ASYNCTASK; @RequestMapping ("") Public String Dotask () พ่น InterruptedException {Long CurrentTimeMillis = System.currentTimeMillis (); อนาคต <String> task1 = asynctask.task1 (); อนาคต <String> task2 = asynctask.task2 (); อนาคต <String> task3 = asynctask.task3 (); สตริงผลลัพธ์ = null; สำหรับ (;;) {ถ้า (task1.isdone () && task2.isdone () && task3.isdone ()) {// ทั้งสามงานถูกเรียกให้เสร็จสมบูรณ์ออกจากลูปและรอการหยุดพัก; } thread.sleep (1,000); } long currenttimemillis1 = system.currenttimeMillis (); result = "ใช้เวลาทั้งหมดของงาน:"+(currentTimeMillis1-currentTimeMillis)+"MS"; ผลการกลับมา; -เอาต์พุตคอนโซล:
TASK1 เวลางาน: 1,000ms งาน 2 เวลางาน: 2001MS งาน task3 เวลางาน: 3001ms
เอาต์พุตเบราว์เซอร์:
เวลางานทั้งหมด: 4015ms
การโทรแบบอะซิงโครนัสประสบความสำเร็จและโปรแกรมจะส่งคืนผลลัพธ์เฉพาะเมื่องานทั้งหมดเสร็จสิ้น!
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com