2012-05-28 17 views
8

का समर्थन करने के लिए फ़िल्टर को अपग्रेड कैसे करें मेरे पास एक सर्वलेट है जिसका उपयोग कई तृतीय पक्ष REST डेटापॉइंट्स से डेटा लाने के लिए किया जाता है, सभी डेटा को एकीकृत करता है और HTML प्रारूप में डेटा की रिपोर्ट करता है।सर्वलेट 3.0 एसिंक्रोनस सर्वलेट

  1. एक घटना रिकॉर्ड बनाना जब अनुरोध फिल्टर हिट और अनुरोध
  2. को eventrecord वस्तु जोड़ने chain.doFilter प्रदर्शन - - सर्वलेट अधिक जोड़ने के लिए अनुमति देता है जो मैं भी जो निम्नलिखित प्रवाह है एक फिल्टर है eventrecord
  3. ब्राउज़र पर वापस आने के लिए विवरण, फ़िल्टर eventrecord ऑब्जेक्ट प्राप्त करता है और इसे लॉग करता है।

अब अगर मैं AsyncContext context = request.getAsyncContext();, जो एक ही बाकी datapoints के लिए, लेकिन के रूप में बात करेंगे का उपयोग कर अतुल्यकालिक सर्वलेट का उपयोग करें और जब डेटा तैयार है, यह बजाय सभी बाकी डेटा बिंदुओं प्रतिक्रिया करने के लिए के लिए इंतजार की प्रतिक्रिया स्ट्रीम में लिखें होगा, मैं अपना फ़िल्टर कैसे लिखूं? क्या यह थ्रेड से जुड़ा होगा जो आरईएसटी डेटा पॉइंट्स से डेटा फ्लश करने के लिए ज़िम्मेदार है ताकि एक बार सभी डेटा संसाधित हो जाए और बह जाए, तो यह इवेंट्रेकॉर्ड लॉग करेगा? क्या कोई आम पैटर्न है जिसे मैं समझने के लिए पढ़ सकता हूं कि कैसे उपयोग मामलों को Servlet 3.0 के एसिंक्रोनस servlets के साथ संभाला जा सकता है? मैं जेडीके 6.0, टॉमकैट 7.0 का उपयोग कर रहा हूं।

उत्तर

7

बस अपने फ़िल्टर के लिए वेब-एक्सएमएल में @WebFilter(urlPatterns = {"/*" }, asyncSupported = true) जोड़ें।

या जोड़ने <async-supported>true</async-supported>

0

मैं एक इनाम के रूप में डाल दिया है मैं अपने आप को अनिश्चित कैसे ठीक instrumenting या नैदानिक ​​फिल्टर का समर्थन करने के (जैसे Codahales metrics filters) कर रहा हूँ।

अपने फ़िल्टर में <async-supported>true</async-supported> जोड़ते समय निश्चित रूप से उन्हें काम पर दिखाई देगा, यह आपके द्वारा अपेक्षित नतीजे प्राप्त नहीं हो सकता है (मेट्रिक्स के मामले में आपके सभी अनुरोध बहुत तेज दिखाई देंगे)।

यह मेट्रिक डेटा but various containers apparently have issues with this को बांधने के लिए फ़िल्टर में तुरंत AsyncContext प्राप्त करने के लिए एक अच्छा विचार प्रतीत हो सकता है और मुझे विश्वास है कि स्प्रिंग जैसे ढांचे के साथ-साथ समस्याएं भी हो सकती हैं (यह सिर्फ वसंत का मेरा पुराना संस्करण हो सकता है)। यह सबसे ढांचा है कि अनुरोध के पहले भाग को सिंक्रोनस (मैं शायद इस पर बड़े पैमाने पर गलत) होने की उम्मीद करता हूं।

परिणामस्वरूप यह फ्रेमवर्क स्तर पर फ़िल्टर को एकीकृत करने का एकमात्र मूर्ख प्रमाण तरीका है। उदाहरण के लिए वसंत org.springframework.web.context.request.async.DeferredResultProcessingInterceptor प्रदान करता है जो कुछ AsyncContext घटनाओं के समान है।

यह कुछ हद तक दुर्भाग्यपूर्ण है क्योंकि वेब अनुरोध द्वारा सभी अनुरोधों को संभाला जा सकता है लेकिन फिर अनुरोध के पहले भाग को संभालने और वास्तव में पूरा करने के बीच अंतर होता है (यानी अब दो मेट्रिक्स जिन्हें आप मॉनिटर करना चाहते हैं)।

0

@ वेबफिल्टर एनोटेशन जावा ईई 6 में पेश किया गया है। यह फिल्टर तत्व, asyncSupported और servletNames इत्यादि जैसे विभिन्न तत्वों को परिभाषित करता है @WebFilter का उपयोग web.xml के बिना नहीं किया जा सकता है क्योंकि @WebFilter आदेश को परिभाषित नहीं करता है। @WebFilter web.xml में अन्य कॉन्फ़िगरेशन को कम कर देता है।

@WebFilter(filterName="filterOne") 
public class FilterOne implements Filter { 
    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 
    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
     System.out.println("Inside filter one."); 
     chain.doFilter(request, response); 
    } 
    @Override 
    public void destroy() { 
    } 
} 
संबंधित मुद्दे