मैं वसंत के घोषणात्मक लेनदेन (@ traansactional एनोटेशन) का उपयोग "पहलू" मोड में कर रहा हूं। यह ज्यादातर मामलों में काम करता है जैसा कि इसे करना चाहिए, लेकिन एक के लिए यह नहीं है। हम इसे Lang
पर कॉल कर सकते हैं (क्योंकि यही वह है जिसे वास्तव में कहा जाता है)।AspectJ लोड टाइम वीवर सभी वर्गों का पता नहीं लगाता
मैं लोड टाइम वीवर को समस्या को इंगित करने में सक्षम हूं। Aop.xml में डीबग और वर्बोज़ लॉगिंग चालू करके, यह बुने जाने वाले सभी वर्गों को सूचीबद्ध करता है। समस्याग्रस्त वर्ग Lang
वास्तव में लॉग में बिल्कुल उल्लेख नहीं किया गया है।
फिर मैंने Lang
के शीर्ष पर ब्रेकपॉइंट लगाया, जिससे Lang
कक्षा लोड होने पर एक्लिप्स को थ्रेड को निलंबित कर दिया गया। एलटीडब्लू अन्य कक्षाओं को बुनाई करते समय यह ब्रेकपॉइंट मारा जाता है! तो मुझे लगता है कि यह या तो Lang
बुनाई करने की कोशिश करता है और विफल रहता है और आउटपुट नहीं करता है, या किसी अन्य वर्ग के पास एक संदर्भ है जो इसे Lang
लोड करने के लिए मजबूर करता है इससे पहले कि इसे वास्तव में बुनाई का मौका मिलता है।
मुझे यकीन नहीं है कि इसे कैसे डिबग करना जारी रखें, क्योंकि मैं इसे छोटे पैमाने पर पुन: पेश नहीं कर पा रहा हूं। कैसे चलना है इस पर कोई सुझाव?
अद्यतन: अन्य सुराग भी स्वागत है। उदाहरण के लिए, एलटीडब्ल्यू वास्तव में कैसे काम करता है? ऐसा लगता है कि बहुत सारे जादू हो रहे हैं। क्या एलटीडब्ल्यू से और भी डीबग आउटपुट प्राप्त करने के लिए कोई विकल्प हैं? मैं वर्तमान में है: LTW, जैसे कि, InstrumentationLoadTimeWeaver
अनुमति देने के लिए किया जा रहा है वसंत-एजेंट:
<weaver options="-XnoInline -Xreweavable -verbose -debug -showWeaveInfo">
मैं भूल गया था टॉम से पहले ही उल्लेख है।
एंडी क्लेमेंट के सुझावों को मैं निरीक्षण करने के लिए है कि क्या AspectJ ट्रांसफार्मर कभी है फैसला किया के आधार पर भी वर्ग पारित कर दिया। मैंने ClassPreProcessorAgent.transform(..)
में ब्रेकपॉइंट लगाया, और ऐसा लगता है कि Lang
क्लास उस वर्ग तक कभी भी पहुंच नहीं पाती है, भले ही इसे उसी वर्ग लोडर द्वारा अन्य वर्गों (जेटी के WebAppClassLoader का एक उदाहरण) के रूप में लोड किया जा रहा हो।
फिर मैंने InstrumentationLoadTimeWeaver$FilteringClassFileTransformer.transform(..)
में ब्रेकपॉइंट डालने के लिए आगे बढ़े। Lang
के लिए भी कोई हिट नहीं है। और मेरा मानना है कि सभी लोड किए गए वर्गों के लिए विधि को लागू किया जाना चाहिए, भले ही वे किस श्रेणी लोडर का उपयोग कर रहे हों। यह इस तरह दिखने लग रहा है:
- मेरे डिबगिंग के साथ एक समस्या। संभावित रूप से
Lang
उस समय लोड नहीं होता है जब ग्रहण रिपोर्ट करता है - जावा बग? दूर-दराज, लेकिन मुझे लगता है कि ऐसा होता है।
अगला सुराग: मैं -verbose:class
चालू है और यह रूप में अगर Lang
है समय से पहले ही लोड किए जा रहे प्रतीत होता है - शायद पहले ट्रांसफार्मर इंस्ट्रुमेंटेशन में जोड़ा जाता है। विचित्र रूप से, मेरे ग्रहण ब्रेकपॉइंट इस लोडिंग को पकड़ नहीं लेता है।
इसका मतलब है कि वसंत नया संदिग्ध है। ConfigurationClassPostProcessor
में कुछ प्रसंस्करण प्रतीत होता है जो कक्षाओं को उनका निरीक्षण करने के लिए लोड करता है। यह मेरी समस्या से संबंधित हो सकता है।
ConfigurationClassBeanDefinitionReader
में ये लाइनें का कारण बनता है Lang
वर्ग पढ़ने के लिए:
else if (metadata.isAnnotated(Component.class.getName()) ||
metadata.hasAnnotatedMethods(Bean.class.getName())) {
beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_LITE);
return true;
}
वर्ग है, जो कि कक्षा में सभी तरीकों के सभी पैरामीटर वर्गों को लोड करता है पर
विशेष रूप से, metadata.hasAnnotatedMethods()
कॉल getDeclaredMethods()
। मुझे लगता है कि यह समस्या का अंत नहीं हो सकता है, क्योंकि मुझे लगता है कि कक्षाओं को उतार दिया जाना चाहिए। क्या अज्ञात कारणों के लिए जेवीएम कक्षा के उदाहरण को कैश कर सकता है?
उत्तर के लिए धन्यवाद। दिलचस्प विचार है कि स्ट्रिंग "लैंग" एक समस्या का कारण बन सकती है। लेकिन मुझे उल्लेख करना चाहिए था, अन्य वर्ग भी हैं (कम से कम एक) भी बुना नहीं जा रहा है। अन्य ज्ञात व्यक्ति को कमसेवर कहा जाता है। तो मुझे शक है कि समस्या है। हालांकि मुझे एस्पेक्टजे स्रोत को देखना शुरू करना पड़ सकता है। – waxwing