2012-05-05 11 views
12

मैं क्वार्ट्ज के लिए बहुत नया हूं और मुझे नौकरियों के जीवन चक्र के बारे में कुछ संदेह हैं।जब क्वार्ट्ज नौकरी की आग लगती है, तो क्या यह एक नया नौकरी वर्ग का उदाहरण है?

मान लीजिए कि मेरे पास कुछ सामान करने के लिए कॉन्फ़िगर किया गया एक ही काम है।

नौकरी आग लगती है और इसके काम को समाप्त करती है। जब यह फिर से आग लगती है तो यह वही उदाहरण है (शायद शेड्यूलर द्वारा सोना और जागृत होना) या यह एक नया नौकरी उदाहरण है (एक बार जब नौकरी खत्म हो जाती है तो उसे मार दिया जाता है और जब ट्रिगर की स्थिति फिर मिलती है तो एक नया जॉब इंस्टेंस बनाया जाता है) ?

मैं ऐसे प्रश्न पूछता हूं क्योंकि जब मैं अपना आवेदन डीबग करता हूं (क्वार्ट्ज समर्थन के साथ वसंत 3 एमवीसी) मैं नौकरी के नए उदाहरण देखता हूं और सरल थ्रेडपूल $ WorkerThreadRun() के साथ नए धागे को हर बार नौकरी निकाल दिया जाता है ताकि SimpleThreadPool $ WorkerTreadRun() धागे ढेर किए जाते हैं और कभी समाप्त नहीं होते हैं।

मैं सिर्फ यह जानना चाहते हैं इस व्यवहार allright है या मैं स्मृति ;-)

किसी को भी मुझे कुछ स्पष्टीकरण दे सकते हैं भरने के लिए बाध्य कर रहा हूँ करना चाहते हैं? अग्रिम में धन्यवाद।

उत्तर

15

क्वार्ट्ज हर बार जब वह नौकरी ट्रिगर करना चाहता है तो अपनी नौकरी कक्षा का नया उदाहरण बनाता है। मान लीजिए कि आपके पास बहुत बार काम करने के लिए सैकड़ों हजारों नौकरियां निर्धारित की गई हैं - यह उन सभी नौकरियों को स्मृति में रखने के लिए स्मृति की बर्बादी होगी।

हालांकि यदि आप Spring support for Quartz का उपयोग कर रहे हैं, खासकर MethodInvokingJobDetailFactoryBean, वसंत आपके काम के जीवन चक्र को संभालेगा (यह मूल रूप से आपके बीन्स में से एक की नामित विधि को कॉल करता है)। लेकिन ऐसा लगता है कि आपके आवेदन में मामला नहीं है।

नौकरी के बाद पाठ्यक्रम के बाद और कोई अन्य संदर्भ इसकी ओर इशारा नहीं कर रहा है (जो सामान्य मामला है) कचरा कलेक्टर अंततः नौकरी से कब्जा कर लिया गया स्मृति जारी करेगा)।

अंत में धागे के बारे में - क्वार्ट्ज कार्यकर्ता धागे का एक निश्चित पूल बनाता है (org.quartz.threadPool.threadCount कॉन्फ़िगरेशन विकल्प देखें)। हर बार जब आप नौकरी चलाते हैं तो क्वार्ट्ज एक अलग धागे का उपयोग करने का फैसला कर सकता है - लेकिन यह हर ट्रिगर के लिए नया धागा नहीं बनाएगा।

+0

आपको बहुत बहुत धन्यवाद। आपकी व्याख्या सरल और स्पष्ट है और यही मुझे वास्तव में जरूरी है! असल में मेरे आवेदन में मैं 'जॉब डेंटलबीन', 'क्रोन ट्रिगर बीन' और 'शेड्यूलर फैक्ट्रीबीन' का उपयोग कर रहा हूं, लेकिन आपका जवाब पढ़ रहा हूं, मुझे लगता है कि लाइफसाइकिल वसंत द्वारा भी संभाला जाता है, जिसमें स्मृति दोषों का कोई खतरा नहीं है। फिर से Thnks। – MaVVamaldo

+0

"MethodInvokingJobDetailFactoryBean" के बारे में। वसंत आपके ** बीन ** के जीवन चक्र को संभालेगा और इस बीन की विधि क्वार्ट्ज-जॉब ("org.quartz.Job" इंटरफ़ेस लागू करती है, वसंत में "क्वार्ट्ज जोबबीन" अमूर्त वर्ग का बच्चा)। और यह क्वार्ट्ज-जॉब इंस्टेंस मेरे उत्तर में वर्णित के रूप में बनाया जाएगा। –

+0

हैलो @ टॉमसज़, क्या आप कृपया मुझे बता सकते हैं कि जेएसपी से एक बटन के क्लिक पर doIt() विधि (उदाहरण के लिए स्प्रिंग डॉक्स से) को कैसे कॉल करें। मैं क्वार्ट्ज नौकरी का उपयोग कर रहा हूं लेकिन मेरी जॉब क्लास की मेरी निष्पादन() विधि को कॉल नहीं किया जा रहा है।मैं कुछ ट्रिगर और जॉब के साथ MethodInvokingJobDetailFactoryBean का उपयोग कर रहा हूं शेड्यूलर फैक्ट्रीबीन के साथ विवरण, लेकिन मांग पर नहीं, कुछ निश्चित समय अंतराल पर उन्हें बुलाया जाता है। धन्यवाद – Jaikrat

3

मैं संस्करण 2.1.5 (नवीनतम संस्करण) के बारे में लिखूंगा, लेकिन यह अन्य संस्करणों के लिए भी सच हो सकता है।

Job - उदाहरण के लिए "न्यूजोब" -फंक्शन (SimpleJobFactory) के साथ "जॉबफैक्टरी" के कुछ उदाहरण द्वारा बनाए गए इंस्टेंस। "प्रारंभिक" में निष्पादित "newJob" पर कॉल करें- JobRunShell -class के विधि। JobRunShell -object "QuartzSchedulerThread .run" के स्थानीय चर में आयोजित किया गया है और किसी अन्य सूची या फ़ील्ड में संग्रहीत नहीं है।

तो, नया Job - प्रत्येक ट्रिगर समय के लिए बनाए गए इंस्टेंस और निष्पादन के बाद इसे कचरा कलेक्टर द्वारा सामान्य रूप से साफ किया जाएगा।

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