2014-12-16 7 views
6

मैं एक स्प्रिंग एमवीसी नियंत्रक का उपयोग कर रहा हूं और एक कार्य के निष्पादन को शुरू करना चाहता हूं। लेकिन थ्रेड तुरंत शुरू नहीं होना चाहिए, लेकिन ग्राहक को प्रतिक्रिया भेजने के बाद ही।प्रतिक्रिया भेजने के बाद वसंत नियंत्रक प्रसंस्करण शुरू होता है

मतलब - सख्त अस्थायी क्रम में:

  1. अनुरोध
  2. वापसी नई ResponseEntity .../ग्राहक HTTP स्थिति 200 ठीक प्राप्त करता है।
  3. कार्य की प्रसंस्करण शुरू होती है।

मैं इसे कैसे प्राप्त करूं?

मैं वसंत के एसिंक अबास्ट्रक्शन का उपयोग करना चाहता था, @Async के साथ एनोटेटेड विधि को बुला रहा था, लेकिन इस तरह से मैंने गारंटी नहीं दी है कि नया धागा भेजने के लिए प्रतिक्रिया की प्रतीक्षा करता है।

+0

क्या आप हमें दिखा सकते हैं कि आपने अभी तक क्या किया है? – Marv

उत्तर

8

आप इसके लिए एक इंटरसेप्टर का उपयोग कर सकते हैं।आदेश या वसंत MVC में एक अनुरोध से निपटने के लिए घटनाओं है:

  • DispatcherServlet एक अनुरोध, प्रतिक्रिया जोड़ी हो और निर्धारित करता है से निपटने
  • [वैकल्पिक] preHandle कहा जाता है इंटरसेप्टर (विकल्प के साथ प्रसंस्करण को रोकने के लिए)
  • [वैकल्पिक] नियंत्रक कहा जाता है इंटरसेप्टर postHandle
  • ViewResolver कहा जाता है और दृश्य वास्तविक प्रतिक्रिया प्रसंस्करण करते हैं और प्रतिक्रिया
  • [वैकल्पिक] भेज इंटरसेप्टर afterComp letion

कहा जाता है ऊपर से अधिक simplificated जाता है और सिर्फ इतना है कि इंटरसेप्टर afterCompletion तरीकों दिखा के बाद प्रतिक्रिया ग्राहक के लिए sended कर दिया गया है, तो निम्न हस्ताक्षर के साथ कहा जाता है के उद्देश्य से है:

void afterCompletion(HttpServletRequest request, 
        HttpServletResponse response, 
        Object handler, 
        Exception ex) 
        throws Exception 

कि विधि में, आप अपनी प्रसंस्करण शुरू करने से पहले अपवाद के अवसर और प्रतिक्रिया की सहीता (ex == null && response.getStatus == HttpServletResponse.SC_OK) का परीक्षण कर सकते हैं।

+1

@ हिले ने पहले ही विचार दिया है लेकिन मैं इस उत्तर की तैयारी कर रहा था और इसे पोस्ट करने के बाद ही देखा था। –

+0

मुझे एक उपरांत दें और सबकुछ ठीक है :-)। – Hille

+0

@ हिले: आप वास्तव में इसके लायक हैं! –

0

प्रतिक्रिया इकाई बनने से पहले, आप कार्य को अवरुद्ध कतार में जोड़ सकते हैं। एक कार्य निष्पादक को कतार में समय-समय पर (प्रत्येक x सेकंड) चलाएं और कार्यों के लिए मतदान करें। यदि कोई कार्य मिलता है, तो इसे निष्पादित किया जाएगा। यदि नहीं, तो धागा अपनी रन विधि समाप्त करता है और अगले भाग (x सेकंड में) के लिए प्रतीक्षा करता है।

समय-समय पर एक कार्य कैसे चलाएं: http://www.mkyong.com/java/how-to-run-a-task-periodically-in-java/

दोनों नियंत्रक और कार्य प्रबंधक सेवा में निर्भरता के रूप में कतार सम्मिलित करें। यह शुरू करने के लिए एक आसान समाधान होना चाहिए।

इस szenario में आप सुनिश्चित नहीं हो सकते हैं कि ग्राहक अनुरोध प्राप्त करता है। लेकिन अगर आप सुरक्षित होना चाहते हैं (आर), पर्याप्त कार्यसेट (उदा। वर्तमान समय + 30 सेकंड) के साथ अपने कार्य ऑब्जेक्ट की देय तिथि जोड़ें। कार्य निष्पादक को जांचें कि क्या मतदान कार्य की देय तिथि अब या अतीत में है। अन्यथा इस दौड़ के लिए कार्य को अनदेखा करें।

3

यदि आपका "जवाब भेजने के बाद" आवश्यकता पूरी हो जाती है "दृश्य प्रस्तुत किए जाने के बाद" आप HandlerInterceptor के कार्यान्वयन का उपयोग कर सकते हैं। उदाहरण के लिए सीएफ। Spring 3 MVC Interceptor tutorial with example, afterCompletion में अपना काम शुरू कर रहा है।

यदि आपके काम को तार के बाद "ट्रिगर करने के बाद" ट्रिगर करने की आवश्यकता है, तो मैं जानना चाहता हूं कि क्यों।

संबंधित मुद्दे