ในฤดูใบไม้ผลิ MVC3.2 ขึ้นไปจะมีการเพิ่มการประมวลผลการร้องขอแบบอะซิงโครนัสซึ่งจะถูกห่อหุ้มตาม servlet3
1. แก้ไข web.xml
<? xml เวอร์ชัน = "1.0" การเข้ารหัส = "utf-8"?> <web-app version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://ww.w3.org/200 xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> ...
1.1. ประกาศเวอร์ชัน = "3.0" ประกาศ web-app_3_0.xsd
1.2. เปิดใช้งานการสนับสนุนแบบอะซิงโครนัสสำหรับการตั้งค่า servlet หรือตัวกรอง: <sync-upported> True </async-upported> เพื่อแก้ไข web.xml ของเว็บแอปพลิเคชัน
<!- ฤดูใบไม้ผลิ MVC -> <servlet> <servlet-name> springmvc </servlet-name> <servlet-lass> org.springframework.web.servlet.dispatcherservlet </servlet-lass> <int-param> <param-name> extConfigLocation </param-name> <param-value> ... </param-value> </init-param> <load-on-startup> 1 </load-on-startup>
2. ทำให้การสนับสนุนคลาสคอนโทรลเลอร์ async
2.1. ส่งคืน java.util.concurrent.callable เพื่อให้เสร็จสิ้นการประมวลผลแบบอะซิงโครนัส
แพ็คเกจ org.springframework.samples.mvc.async; นำเข้า java.util.concurrent.callable; นำเข้า org.springframework.stereotype.controller; นำเข้า org.springframework.ui.model; นำเข้า org.springframework.web.bind.annotation.exceptionhandler; นำเข้า org.springframework.web.bind.annotation.requestmapping; นำเข้า org.springframework.web.bind.annotation.requestparam; นำเข้า org.springframework.web.bind.annotation.responsebody; นำเข้า org.springframework.web.context.request.async.webasynctask; @controller @requestmapping ("/async/callable") คลาสสาธารณะ callableController {@requestmapping ("/response-body") สาธารณะ @ResponseBody callable <string> callable () {ส่งคืน callable ใหม่ <string> () {@override การเรียกสตริงสาธารณะ ส่งคืน "ผลลัพธ์ที่เรียกได้"; - } @RequestMapping ("/view") Public Callable <String> callableWithView (รุ่นโมเดลสุดท้าย) {ส่งคืน callable ใหม่ <string> () {@Override การเรียกสตริงสาธารณะ () โยนข้อยกเว้น {thread.sleep (2000); model.addattribute ("foo", "bar"); model.addattribute ("Fruit", "Apple"); กลับ "Views/HTML"; - } @RequestMapping ("/exception") สาธารณะ @ResponseBody callable <string> callableWithException (สุดท้าย @requestparam (จำเป็น = false, defaultValue = "true") Boolean จัดการ) {ส่งคืน callable ใหม่ <string> () {@override การเรียกสตริงสาธารณะ () ถ้า (จัดการ) {// ดูวิธีการจัดการเพิ่มเติมด้านล่างโยน unlueLstateException ใหม่ ("ข้อผิดพลาดที่เรียกได้"); } else {โยน unledalargumentException ใหม่ ("ข้อผิดพลาดที่เรียกได้"); - } @RequestMapping ("/Custom-Timeout-Handling") สาธารณะ @ResponseBody WebAsyNCTASK <String> callableWithCustomTimeouthAndling () {callable <String> callable = ใหม่ callable <string> () {@Override การเรียกสตริงสาธารณะ () ส่งคืน "ผลลัพธ์ที่เรียกได้"; - ส่งคืน webasynctask ใหม่ <string> (1,000, callable); } @ExceptionHandler @ResponseBody String String (unlueLstateException ex) {return "ข้อยกเว้นที่จัดการ:" + ex.getMessage (); -2.2. return org.springframework.web.context.request.async.deferredresult เมื่อการประมวลผลแบบอะซิงโครนัสเสร็จสมบูรณ์เช่น JMS หรือข้อความ AMQP การแจ้งเตือน Redis ฯลฯ :
@requestmapping ("/quotes")@responsebodypublic deferredresult <string> quotes () {deferredResult <string> deferredResult = new DeferredResult <string> (); // เพิ่ม deferredresult ลงในคิวหรือแผนที่ ... ส่งคืน deferredresult;} // ในเธรดอื่น ๆ ... deferredresult.setResult (ข้อมูล); // ลบ deferredresult จากคิวหรือแผนที่3. การปรับเปลี่ยนไฟล์การกำหนดค่าสปริง
การประกาศ DTD ของ Spring MVC จะต้องมากกว่าหรือเท่ากับ 3.2
<MVC: คำอธิบายประกอบ-ขับเคลื่อน> <!-คุณสามารถใช้การหมดเวลาเริ่มต้น-> <mvc: async-support ค่าเริ่มต้น-timeout = "3000"/> </mvc: คำอธิบายประกอบ-ขับเคลื่อน>
ตัวอย่างการใช้งานจริง:
ฟังก์ชั่น deferred () {$ .get ('quotes.htm', ฟังก์ชั่น (ข้อมูล) {console.log (ข้อมูล); deferred (); // ทุกครั้งที่คำขอเสร็จสมบูรณ์ให้ส่งคำขออื่นเพื่อหลีกเลี่ยงการรีเฟรชไคลเอนต์เป็นประจำเพื่อรับข้อมูล});}; ข้อดีของการทำเช่นนี้ช่วยหลีกเลี่ยงการใช้งานพูลการเชื่อมต่อเว็บเซิร์ฟเวอร์ในระยะยาวทำให้เกิดปัญหาด้านประสิทธิภาพ หลังจากการโทรแล้วเธรดบริการที่ไม่ใช่ Web จะถูกสร้างขึ้นเพื่อประมวลผลเพิ่มปริมาณงานของเว็บเซิร์ฟเวอร์ ~~
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น