2011-02-18 21 views
5

मैं स्प्रिंग 3 बैकएंड के साथ स्ट्रूट 2 का उपयोग कर एक वेब-ऐप विकसित कर रहा हूं। मैं स्प्रिंग एओपी का उपयोग कर रहा हूं: प्रॉक्सी बीन्स स्ट्रैट्स 2 सत्रवेयर इंटरफ़ेस की बजाय मेरे सत्र बीन्स को संभालने के लिए। सब कुछ ठीक काम कर रहा था जब तक कि मेरे पास स्ट्रेट्स ExecAndWait इंटरसेप्टर के तहत चल रही कोई कार्रवाई न हो। चूंकि यह इंटरसेप्टर प्रभाव में एक अलग थ्रेड के नीचे मेरी कार्रवाई चलाता है, जब मैं अपने प्रॉक्सीड सत्र बीन को आजमाने और एक्सेस करने के लिए आता हूं, तो मुझे बीनक्रिएशन अपवाद/अवैध स्तर अपवाद मिलता है। क्या एक और "वसंत रास्ता" है कि मैं इस परिदृश्य में अपने सत्र बीन्स को पकड़ सकता हूं?वसंत सत्र तक पहुंचने से प्रॉक्सी बीन्स

सादर

+0

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

उत्तर

0

आप वसंत का उपयोग कर अपनी खुद की ExecAndWait इंटरसेप्टर को लागू कर सकते हैं। आप इस क्रिया के प्रबंधन/निर्माण को स्प्रिंग में भी प्रतिनिधि दे सकते हैं। बाद में विवरण एस 2 वसंत प्लगइन दस्तावेज में हैं।

3

से Execute and Wait Interceptor प्रलेखन

महत्वपूर्ण: क्योंकि कार्रवाई एक अलग धागे में चल रहे हो जाएगा, आप ActionContext उपयोग नहीं कर सकते, क्योंकि यह एक ThreadLocal है। इसका अर्थ यह है कि यदि आपको एक्सेस करने की आवश्यकता है, उदाहरण के लिए, सत्र डेटा, आपको ActionContext.getSession() को कॉल करने के बजाय सत्रवेयर को लागू करने की आवश्यकता है।

सत्र scoped-सेम के साथ समस्या यह है कि वे धागे की स्थानीय विशेषताओं RequestContextListener या RequestContextFilter द्वारा निर्धारित पर निर्भर है। लेकिन उत्तरार्द्ध आपको बहुत रोचक threadContextInheritable ध्वज सेट करने की अनुमति देता है ...

यदि आपका ExecAndWait इंटरसेप्टर प्रत्येक अनुरोध के अनुसार नया धागा बनाता है, तो विरासत योग्य थ्रेड स्थानीय को बच्चों के धागे में सत्र स्कोप्ड बीन्स का प्रचार करना चाहिए। हालांकि अगर स्ट्रेट्स इस अनुरोध को पूरा करने के लिए थ्रेड पूल का उपयोग करता है (अधिक संभावना है, आपने स्ट्रैट्स 2 का उपयोग नहीं किया है), तो यह बहुत अप्रत्याशित और खतरनाक परिणाम होगा। आप इस ध्वज के साथ प्रयोग कर सकते हैं, शायद यह चाल करेगा।

0

आप RequestContextHolder (थ्रेड-बाउंड RequestAttributes ऑब्जेक्ट के रूप में वेब अनुरोध का पर्दाफाश करने के लिए होल्डर क्लास का उपयोग कर सकते हैं।) सत्र स्कॉप्ड प्रॉक्सी बीन्स को बच्चों के धागे के लिए उपलब्ध कराने के लिए उपयोग कर सकते हैं।

एक कस्टम ExecuteAndWait इंटरसेप्टर परिभाषित करें और doIntercept विधि में

public static void setRequestAttributes RequestContextHolder से निम्नलिखित स्थिर विधि का उपयोग करें (RequestAttributes गुण, बूलियन दाय) वर्तमान को

बाइंड दिया RequestAttributes धागा।

पैरामीटर: गुण - RequestAttributes बेनकाब करने के लिए, या धागे से बंधे संदर्भ रीसेट करने के लिए अशक्त दाय - बच्चा धागे के लिए दाय के रूप में RequestAttributes (एक InheritableThreadLocal का उपयोग कर)

नमूना बेनकाब करने के लिए है कि क्या कोड

public class CustomExecuteAndWaitInterceptor extends ExecuteAndWaitInterceptor { 

    @Override 
    protected String doIntercept(ActionInvocation actionInvocation) throws Exception { 
     RequestAttributes requestAtteiAttributes = RequestContextHolder.getRequestAttributes(); //Return the RequestAttributes currently bound to the thread. 
     RequestContextHolder.setRequestAttributes(requestAtteiAttributes, true); 
     //do something else if you want .. 
     return super.doIntercept(actionInvocation); 

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