2011-09-06 15 views
5

मैं दिया बड़ी सफलता के साथ AbstractRoutingDataSource का उपयोग कर दिया है, लेकिन एक मुद्दा सूझा है मैं का समाधान नहीं कर सकते हैं: जब मैं एक अतुल्यकालिक विधि @Async का उपयोग कर शुरू, यह स्थानीय धागा के संदर्भ खो देता है, और मैं डेटाबेस संदर्भ स्विच सेट करने के लिए जगह का पता नहीं लगा सकता। आम तौर पर मैं इसे एक पहलू या HandlerInterceptor में करता हूं, लेकिन @Async उन सामान्य मार्गों में से किसी के माध्यम से नहीं जाता है। क्या कोई इंटरसेप्टर या कुछ ऐसा है जो मैं एसिंच कॉल की शुरुआत और अंत में आग लगाने के लिए कॉन्फ़िगर कर सकता हूं ताकि मैं डेटाबेस संदर्भ सेट कर सकूं?स्प्रिंग @Async और AbstractRoutingDataSource

स्प्रिंग संदेश बोर्डों पर एक समान प्रश्न मिला। कोई जवाब नहीं है, हालांकि: http://forum.springsource.org/showthread.php?83792-Async-annotated-method-hanging-on-session-scoped-bean

संपादित करें: DataSource मैं निष्पादन प्रवाह डिबग है, और AbstractRoutingData स्रोत वास्तव में async सूत्र में कहा जाता रहा है, लेकिन इससे पहले पहलू बुलाया जा रहा है इसके बुलाया हो रही है, तोThreadLocal मान सेट होने से पहले ही हाइबरनेट सत्र में पहले से सेट है। AsyncExecutionInterceptor के लिए स्रोत कोड देख रहे हैं, जो @Async का समर्थन करता है, क्योंकि इसकी वजह से इंटरसेप्टर Order मान के रूप में देता है, इसलिए इसे किसी और चीज़ से पहले निकाल दिया जाता है।

enter image description here

उत्तर

2

सोचो मैं इस सवाल का जवाब मिल गया है: विधि निष्पादन अवरोधन के रूप में AsyncExecutionInterceptor हमेशा उच्च पूर्वता होगा ThreadLocal पर चर सेट, और हाइबरनेट लेन-देन शुरू करने के लिए असफल हो जायेगी। इसके बजाए, मैंने जो किया है, वह एसिंक विधि से अपनी कक्षा में तर्क को बाहरी कर दिया गया है, और उस विधि को @Transactional(propagation=Propagation.REQUIRES_NEW) के माध्यम से अपने लेनदेन की आवश्यकता के रूप में चिह्नित किया गया है। चूंकि उप-विधि अब अपने लेन-देन में चलती है, इसलिए ThreadLocal पर परिवर्तनीय नए हाइबरनेट लेनदेन की शुरुआत में AbstractRoutingDataSource द्वारा सही ढंग से उठाया गया है।

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