2013-02-22 24 views
6

मैं इस प्रकार अनुसूचक हो रही है:क्वार्ट्ज - शेड्यूलर को कैसे बंद करें और पुनरारंभ करें?

StdScheduler schedulerBean = (StdScheduler) ApplicationContextUtil.getBean(schedulerBeanName); 
schedulerBean.start(); 

और बाद में

schedulerBean.shutdown(); 
कुछ अन्य कोड को क्रियान्वित करने के बाद

, तो मैं schedulerBean.start बोल रहा हूँ() फिर से। ": समयबद्धक शटडाउन के बाद पुन: प्रारंभ नहीं किया जा सकता() बुलाया गया है org.quartz.SchedulerException"

तुम मुझे जानते हैं कि कैसे इस समस्या को ठीक करने के लिए कृपया किया जा सका -

अब कोड त्रुटि फेंकता है?

अग्रिम धन्यवाद, Kathir

उत्तर

7

एक बार जब आप एक अनुसूचक बंद है, यह धागे के रूप में पुन: प्रारंभ नहीं किया जा सकता और अन्य संसाधनों के स्थायी रूप से नष्ट कर रहे हैं।

आप अपनी आवश्यकताओं को पूरा करने वाली विधि को खोजने के लिए Quartz Scheduler API references पढ़ सकते हैं। नीचे आप कुछ उपलब्ध विधियां पा सकते हैं।

  • standby() विधि। अस्थायी रूप से ट्रिगर्स के शेड्यूलर की फायरिंग को रोकता है। जब प्रारंभ() को कॉल किया जाता है (शेड्यूलर को स्टैंड-बाय मोड से बाहर लाने के लिए), ट्रिगर मिस्फायर निर्देश प्रारंभ() विधि के निष्पादन के दौरान लागू नहीं किए जाएंगे - किसी भी मिस्फायर तुरंत बाद में पाए जाएंगे (जॉबस्टोर की सामान्य प्रक्रिया द्वारा) ।
  • pauseJob(JobKey jobKey) - resumeJob(JobKey jobKey)। दिए गए कुंजी के साथ जॉबडिमेंट को रोकें - अपने सभी मौजूदा ट्रिगर्स को रोककर। फिर से शुरू करें जॉब (जॉबकी जॉबकी) यदि जॉब ट्रिगर में से कोई भी एक या अधिक अग्नि-समय चूक गया है, तो ट्रिगर का मिस्फायर निर्देश लागू किया जाएगा।
  • interrupt(JobKey jobKey)। इस शेड्यूलर इंस्टेंस के भीतर, पहचान की गई नौकरी के वर्तमान में निष्पादित उदाहरणों के दौरान बाधा का अनुरोध करें, जो इंटरप्टेबल जॉब इंटरफ़ेस का कार्यान्वयन होना चाहिए। यदि पहचान की गई नौकरी के एक से अधिक उदाहरण वर्तमान में निष्पादित कर रहे हैं, तो इंटरप्टेबल जॉब # इंटरप्ट() विधि प्रत्येक उदाहरण पर कॉल की जाएगी। हालांकि, एक सीमा है कि यदि एक उदाहरण पर इंटरप्ट() एक अपवाद फेंकता है, तो सभी शेष उदाहरण (जो अभी तक बाधित नहीं हुए हैं) में उनकी इंटरप्ट() विधि नहीं होगी। यदि आप नौकरी के एक विशिष्ट उदाहरण को बाधित करना चाहते हैं (जब एक से अधिक निष्पादित हो रहा है) तो आप नौकरी के उदाहरण के लिए हैंडल प्राप्त करने के लिए getCurrentlyExecutingJobs() को कॉल करके ऐसा कर सकते हैं, और फिर स्वयं पर इंटरप्ट() को आमंत्रित कर सकते हैं। यह विधि क्लस्टर जागरूक नहीं है। यही है, यह केवल इस अनुसूचक उदाहरण में निष्पादित पहचान किए गए इंटरप्टेबल जोब के उदाहरणों को बाधित करेगा, पूरे क्लस्टर में नहीं।
  • unscheduleJob(TriggerKey triggerKey)। शेड्यूलर से संकेतित ट्रिगर निकालें। यदि संबंधित नौकरी में कोई अन्य ट्रिगर्स नहीं है, और नौकरी टिकाऊ नहीं है, तो नौकरी भी हटा दी जाएगी।

ध्यान दें कि आप एक श्रोता जो ServletContextListener इंटरफ़ेस लागू करता है बना सकते हैं ताकि:

  • सभी नौकरियों बाधित कर रहे हैं और अनुसूचक जब कंटेनर
  • बंद हो रहा है अनुसूचक बनाई गई है बंद है और जब कंटेनर शुरू होता है तो नौकरियां निर्धारित की जाती हैं

यदि आप ऐसे श्रोता बनाना चाहते हैं तो मैं अधिक जानकारी प्रदान कर सकता हूं।

मुझे उम्मीद है कि इससे मदद मिलती है।

+1

स्टैंडबाय और प्रारंभ() इस मुद्दे को हल करता है। विवरण के लिए धन्यवाद। (http://my.safaribooksonline.com/book/operating-systems-and-server-administration/0131886703/hello-quartz/ch03lev1sec2) – Kathir

+0

केवल शेड्यूलर.स्टैंडबी() को कॉल करना और फिर शेड्यूलर.स्टार्ट() काम नहीं करता है। – aloplop85

+0

क्या आप सभी नौकरियों को चलाने में बाधा डालने के लिए ServletContextListener को लिखने के बारे में विवरण प्रदान कर सकते हैं और उन्हें कुछ कार्रवाई करने के लिए कह सकते हैं। – Vipul