في الربيع MVC3.2 وما فوق ، تتم إضافة المعالجة غير المتزامنة للطلبات ، والتي يتم تغليفها على أساس servlet3.
1. تعديل web.xml
<؟ 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. DECLARE الإصدار = "3.0" ، إعلان web-app_3_0.xsd
1.2. تمكين الدعم غير المتزامن لإعدادات Servlet أو Filter: <مدعوم من Async> True </async المدعوم> لتعديل web.xml من تطبيق الويب
<!- الربيع MVC -> <Sradlet> <Sradlet-Name> springmvc </servlet-name> <Servlet-class> org.springframework.web.servlet.dispatcherservlet </isherlet-class> <Ing-param> <param-name> تابع ExtConfigLocation </param-name> <param-value> ... </param-value> </ith-param> <load-on-startup> 1 </toad-on-startup> <sunc-supported> true </sonc-sucuported> </servlet>
2. اجعل فئة وحدة التحكم دعمًا
2.1. إرجاع java.util.concurrent.ableable لإكمال المعالجة غير المتزامنة
حزمة 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") الفئة العامة cloomableController {REquestMapping ("/response-body") publicResponsebody callable <string> callable () {return new callable <string> () {Override public call () يلقي استثناء {thread.sleep (2000) ؛ إرجاع "نتيجة قابلة للاستدعاء" ؛ }}} ؛ } @requestmapping ("/view") قابلة للاتصال العامة <string> callableWithView (نموذج النموذج النهائي) {إرجاع جديد callable <string> () {Override Public String Call () يلقي استثناء {thread.sleep (2000) ؛ model.addattribute ("foo" ، "bar") ؛ model.addattribute ("Fruit" ، "Apple") ؛ إرجاع "وجهات النظر/html" ؛ }} ؛ } @requestmapping ("/issection") publicresponsebody callable <string> callableWithException (finalrequestparam (مطلوب = false ، defaultValue = "true") boolean wandled) {return new callable <string> () إذا (معالجة) {// انظر طريقة Handlexception بشكل إضافي أدناه ، قم بإلقاء New FalvealStateException ("خطأ قابل للاتصال") ؛ } آخر {رمي جديد غير alfictalargumentException ("خطأ قابل للاتصال") ؛ }}}}} ؛ } @requestmapping ("/custom-timeout galling") publicResponsebody webasynctask <string> callableWithCustomTimeouthandling () {callable <string> callable = new callable <string> () {Override public call () استثناء {thread.sleep (2000) ؛ إرجاع "نتيجة قابلة للاستدعاء" ؛ }} ؛ إرجاع webasynctask جديد <string> (1000 ، قابلة للاتصال) ؛ } exceptionHandlerResponseBody public string handexception (alfortalStateException ex) {return "استثناء معالجة:" + ex.getMessage () ؛ }}2.2. return org.springframework.web.context.request.async.deferredResult عند اكتمال المعالجة غير المتزامنة ، مثل JMS أو رسالة AMQP ، إخطار redis ، إلخ.:
requestmapping ("/Quotes")@reponseBormpublic DeferRedResult <String> Quotes () {efferredResult <string> efferredResult = new DeferredResult <string> () ؛ // أضف مؤلفًا إلى قائمة انتظار أو خريطة ... إرجاع deferredResult ؛} // في بعض مؤشرات الترابط الأخرى ...3. تعديل ملف تكوين الربيع
يجب أن يكون إعلان DTD الخاص بـ SPRING MVC أكبر من أو يساوي 3.2
<mvc: تعتمد على التعليقات التوضيحية> <!-يمكنك استخدام المهلة الافتراضية-> <mvc: async-support default timeout = "3000"/> </mvc: يحركه التعليق التوضيحي>
أمثلة الاستخدام الفعلي:
الوظيفة deferred () {$ .get ('quotes.htm' ، function (data) {console.log (data) ؛ deferred () ؛ // في كل مرة يتم فيها اكتمال الطلب ، أرسل طلبًا آخر لتجنب تحديث العميل بانتظام للحصول على البيانات}) ؛} تتجنب ميزة القيام بذلك الاستخدام طويل الأجل لمجموعة اتصال خادم الويب ، مما يسبب مشاكل في الأداء. بعد الاتصال ، يتم إنشاء مؤشر ترابط خدمة غير ويب لمعالجته ، وزيادة إنتاجية خادم الويب ~~
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.