ใน Spring Boot (Spring MVC) คำขอจะถูกซิงโครไนซ์ตามค่าเริ่มต้น เธรดมีหน้าที่รับผิดชอบในอดีตและสิ้นสุดการร้องขอ ในหลายกรณีเพื่อปรับปรุงปริมาณงานการดำเนินการบางอย่างจำเป็นต้องมีการซิงโครไนซ์ นอกเหนือจากตรรกะทางธุรกิจที่ใช้เวลานานซึ่งสามารถเป็นแบบอะซิงโครไนซ์แล้วอินเทอร์เฟซแบบสอบถามของเรายังสามารถดำเนินการแบบอะซิงโครนัสได้
มีการร้องขอให้บริการโดยเธรดจากเว็บคอนเทนเนอร์เช่นเธรด HTTP-NIO-8084-EXEC-1
เราสามารถใช้ webasynctask เพื่อแจกจ่ายคำขอนี้ไปยังเธรดใหม่สำหรับการดำเนินการและ HTTP-NIO-8084-Exec-1 สามารถรับการประมวลผลคำขออื่น ๆ ได้ เมื่อ WebasyncTask ส่งคืนข้อมูลจะถูกเรียกและประมวลผลอีกครั้งและค่าจะถูกส่งกลับไปยังด้านที่ร้องขอในลักษณะอะซิงโครนัส
รหัสตัวอย่างมีดังนี้:
@RequestMapping (value = "/login", method = requestMethod.get) WebAsyNcTask สาธารณะ <ModelAndView> longTimetask () {system.out.println ("/ล็อกอินเรียกว่า ID เธรดคือ:" thread.currentthread () getName (); callable <dostorandView> callable = ใหม่ callable <modelandview> () {public modelandview call () พ่นข้อยกเว้น {thread.sleep (1,000); /จำลองงานระยะยาว MODELANDVIEW MAV = ใหม่ MODELANDVIEW ("เข้าสู่ระบบ/ดัชนี"); System.out.println ("การดำเนินการ ID เธรดสำเร็จคือ:" + thread.currentthread (). getName ()); กลับมา mav; - ส่งคืน webasynctask ใหม่ <ModelandView> (callable);}คุณสามารถดูผลลัพธ์ผลลัพธ์ดังนี้:
/เข้าสู่ระบบเรียกว่า ID เธรดคือ: http-nio-8084-exec-1
การดำเนินการสำเร็จเธรด ID คือ: mvcasync1
เธรดก่อนที่จะดำเนินการตรรกะทางธุรกิจและเธรดที่เกี่ยวข้องกับตรรกะทางธุรกิจโดยเฉพาะนั้นไม่เหมือนกันซึ่งบรรลุเป้าหมายของเรา
จากนั้นฉันก็ทำการทดสอบพร้อมกันและพบว่าฉันกำลังสร้างเธรด MVCASYNC1 อยู่ตลอดเวลา ฉันคิดว่าพูลเธรดไม่ได้ใช้หรือไม่?
หลังจากอ่านซอร์สโค้ดฉันพบว่านี่เป็นเรื่องจริง WebasyncManager เป็นคลาสกลางสำหรับ Spring MVC ในการจัดการการประมวลผล Async
ค่าเริ่มต้นคือการใช้ SimpleAsyNcTaskexecutor ซึ่งจะสร้างเธรดใหม่สำหรับแต่ละคำขอ
private asynctaskexecutor taskexecutor = ใหม่ simpleasynctaskexecutor (this.getclass (). getSimplename ());
หากงานระบุผู้ดำเนินการให้ใช้งานระบุ หากไม่ได้ใช้ SimpleAsyNcTaskexecutor เริ่มต้น
asynctaskexecutor executor = webasynctask.getExecutor (); ถ้า (executor! = null) {this.taskexecutor = executor;}เราสามารถกำหนดค่าพูลเธรดของ Async โดยไม่ระบุแยกต่างหากสำหรับแต่ละงาน
ระบุโดย configurer.settaskexecutor (threadpooltaskexecutor ());
นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation.configuration; นำเข้า org.springframework.scheduling.concurrent.threadpooltaskexecutor; org.springframework.web.context.request.async.timeoutcallableprocessingInterceptor; นำเข้า org.springframework.web.servlet.config.annotation.asyncSupportConfigurer; org.springframework.web.servlet.config.annotation.webmvcconfigurationsupport; @configurationPublic คลาส webmvcconfig ขยายการกำหนดค่า {@override) การกำหนดค่า 1000L); configurer.registerCallableableptors (TimeOutInterceptor ()); configurer.settaskexecutor (Threadpooltaskexecutor ()); } @Bean Public TimeOutCallableProcessingInterceptor TimeOutInterceptor () {ส่งคืน TimeOutCallableProcessingInterceptor ใหม่ (); } @Bean Public ThreadPoolTaskexecutor ThreadPoolTaskexecutor () {ThreadPoolTaskexecutor t = ใหม่ ThreadPoolTaskexecutor (); T.SetCorePoolSize (10); T.SetMaxPoolsize (50); T.SetThreadNamePrefix ("YJH"); กลับ t; -หลังการกำหนดค่าคุณจะเห็นว่าชื่อเธรดเอาต์พุตเริ่มต้นด้วย YJH และเธรดใหม่จะไม่ถูกสร้างขึ้นตลอดเวลา
คุณสามารถดูผลลัพธ์ผลลัพธ์ดังนี้:
/เข้าสู่ระบบเรียกว่า ID เธรดคือ: HTTP-NIO-8084-EXEC-1 การดำเนินการสำเร็จ ID เธรดสำเร็จคือ: yjh1
สรุป
ข้างต้นคือสิ่งที่ตัวแก้ไขแนะนำให้ใช้สปริงบูตใช้ webasynctask เพื่อส่งคืนผลลัพธ์แบบอะซิงโครนัส ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!