Di Spring MVC3.2 dan di atas, pemrosesan permintaan asinkron ditambahkan, yang dienkapsulasi berdasarkan servlet3.
1. Ubah Web.xml
<? Xml Version = "1.0" encoding = "UTF-8"?> <Web-app Versi = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http:/www.w3.org/org/2001 =" http:/www.w3.org/org/p21 xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> ... </web-app>
1.1. Deklarasi Versi = "3.0", Deklarasikan Web-App_3_0.xsd
1.2. Aktifkan dukungan asinkron untuk pengaturan servlet atau filter: <Sinync-didukung> true </async-supported> Untuk memodifikasi web.xml aplikasi web
<!- Spring MVC -> <servlet> <servlet-name> springmvc </servlet-name> <servlet-class> org.springframework.web.servlet.dispatcherServlet </servlet-class> <init-param> <param-name> cont ExtConfigLocation </param-name> <param-value> ... </param-value> </it-param> <Boad-on-startup> 1 </boid-on-startup> <Supported> true </async-supported> </servlet>
2. Buat Dukungan Kelas Pengendali Async
2.1. Kembalikan java.util.concurrent.callable untuk menyelesaikan pemrosesan asinkron
paket org.springframework.samples.mvc.async; impor java.util.concurrent.callable; impor org.springframework.stereotype.controller; impor org.springframework.ui.model; impor org.springframework.web.bind.annotation.exceptionHandler; impor org.springframework.web.bind.annotation.requestmapping; impor org.springframework.web.bind.annotation.requestparam; impor org.springframework.web.bind.annotation.responseBody; impor org.springframework.web.context.request.async.webasynctask; @Controller @requestMapping ("/async/callable") kelas publik callablecontroller {@RequestMapping ("/response-body") public @ResponseBody Callable <String> Callable () {return baru Callable <String> () {@Override Public String call () Lempar Exception {thread.slee-leep (2000); mengembalikan "hasil yang dapat dipanggil"; }}}; } @RequestMapping ("/view") Publik Callable <String> CallableWithView (model final model) {return baru Callable <String> () {@Override Public String call () melempar Exception {thread.sleep (2000); model.addattribute ("foo", "bar"); model.addattribute ("buah", "apel"); mengembalikan "views/html"; }}; } @RequestMapping ("/Exception") public @ResponseBody Callable <String> CallableWithException (final @RequestParam (wajib = false, defaultValue = "true") ditangani boolean) {return New Callable <string> () {@Override Public call () Lempar Pengecualian {thread. if (ditangani) {// lihat metode handleException lebih lanjut di bawah ini melempar IllegalStateException baru ("Kesalahan Callable"); } else {throw new ilegalArgumentException ("callable error"); }}}}}; } @RequestMapping ("/custom-timeout-handling") public @ResponseBody WebAsynctask <string> CallableWithCustomTeThandling () {Callable <String> Callable = baru Callable <string> () {@Override Public String call () Throws Exception {thread.sleep (2000); mengembalikan "hasil yang dapat dipanggil"; }}; return new WebAsynctask <string> (1000, dapat dipanggil); } @ExceptionHandler @ResponseBody Public String HandleException (IllegalStateException ex) {return "ditangani Exception:" + ex.getMessage (); }}2.2. Kembalikan org.springframework.web.context.request.async.deferredResult ketika pemrosesan asinkron selesai, seperti JMS atau pesan AMQP, pemberitahuan Redis, dll.:
@RequestMapping ("/Quotes")@responseBodyPublic DeferResult <String> Quotes () {DeferReRResult <String> DeferResult = New DeferResult <String> (); // Tambahkan DeferredResult ke antrian atau peta ... return referredResult;} // Di beberapa utas lain ... DeferredResult.SetResult (data); // Hapus ResultResult dari antrian atau peta3. Modifikasi file konfigurasi pegas
Deklarasi DTD Musim Semi MVC harus lebih besar dari atau sama dengan 3.2
<mvc: anotasi-driven> <!-Anda dapat menggunakan batas waktu default-> <mvc: async-dukungan-waktu-timeout = "3000"/> </mvc: anotasi-driven>
Contoh Penggunaan Aktual:
fungsi ditangguhkan () {$ .get ('quotes.htm', function (data) {console.log (data); ditangguhkan (); // Setiap kali permintaan selesai, kirim permintaan lain untuk menghindari menyegarkan klien secara teratur untuk mendapatkan data});} Keuntungan melakukan ini menghindari penggunaan jangka panjang dari kumpulan koneksi server web, menyebabkan masalah kinerja. Setelah menelepon, utas layanan non-WEB dihasilkan untuk memprosesnya, meningkatkan throughput server web ~~
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.