2013-03-19 10 views
6

में शेड्यूलिंग कार्य मैं एक धागा फैला रहा हूं जो डेटाबेस से रिकॉर्ड्स के हिस्से को खींचकर रखता है और उन्हें कतार में डाल देगा। यह धागा सर्वर लोड पर शुरू किया जाएगा। मैं चाहता हूं कि यह धागा हर समय सक्रिय हो। यदि डेटाबेस में कोई रिकॉर्ड नहीं है, तो मैं इसे प्रतीक्षा करना चाहता हूं और कुछ समय बाद फिर से जांचना चाहता हूं। मैं इसे निर्धारित करने के लिए वसंत कार्य शेड्यूलर का उपयोग करने के बारे में सोच रहा था लेकिन यह सुनिश्चित नहीं है कि यह सही है क्योंकि मैं केवल एक बार अपना काम शुरू करना चाहता हूं। वसंत में इसे लागू करने का अच्छा तरीका क्या होगा?स्प्रिंग/जावा

इसके अलावा, मुझे सीमा जांचने की आवश्यकता है कि यदि मेरा धागा नीचे चला जाता है (किसी भी त्रुटि या अपवाद की स्थिति के कारण) इसे कुछ समय बाद फिर से चालू किया जाना चाहिए।

मैं यह सब थ्रेड संचार विधियों का उपयोग करके जावा में कर सकता हूं लेकिन इस तरह के परिदृश्यों के लिए स्प्रिंग या जावा में कुछ उपलब्ध है या नहीं।

कोई भी सुझाव या सूचक मदद करेगा।

उत्तर

0

आप क्वार्ट्ज शेड्यूलर का उपयोग करने का प्रयास कर सकते हैं। http://quartz-scheduler.org/ इससे आपको कार्य निष्पादन के बीच की अवधि निर्दिष्ट करने की अनुमति मिल जाएगी। आप एक ध्वज (बूलियन) सेट कर सकते हैं जो कहता है कि क्लास पहले डुप्लिकेटिंग कोड से बचने के लिए चला गया है जिसे आप केवल 'पहला' समय चलाना चाहते हैं।

0

स्प्रिंग शेड्यूलिंग कार्यों के लिए आउट-द-बॉक्स समर्थन है। वसंत के नवीनतम 3.2.x संस्करण के लिए Here are for the docs लेकिन आपके द्वारा उपयोग किए जा रहे संस्करण के लिए दस्तावेज़ों की जांच करें। ऐसा लगता है कि यह कार्यों को शेड्यूल करने के लिए हुड के नीचे क्वार्ट्ज का उपयोग करता है।

+0

मैं इसके माध्यम से चला गया हूं, लेकिन मैं नहीं चाहता कि मेरा कार्य कुछ विशिष्ट समय के बाद निष्पादित किया जाए लेकिन केवल एक बार। बस एक परिदृश्य को संभालने की जरूरत है कि यदि मेरे कार्य नीचे चला जाता है तो मैं इसे कैसे पुनर्जीवित कर सकता हूं। – Ashu

6

आप नौकरियों को चलाने के लिए @Scheduled एनोटेशन का उपयोग कर सकते हैं। सबसे पहले एक विधि के साथ एक वर्ग बनाएं जो @Scheduled के साथ एनोटेटेड है।

कक्षा

public class GitHubJob { 

    @Scheduled(fixedDelay = 604800000) 
    public void perform() { 
     //do Something 
    } 
} 

फिर अपने विन्यास फाइल में इस वर्ग के रजिस्टर।

वसंत-context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:task="http://www.springframework.org/schema/task" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 

<tx:annotation-driven/> 
<task:annotation-driven scheduler="myScheduler"/> 

<task:scheduler id="myScheduler" pool-size="10"/> 
<bean id="gitHubJob" class="org.tothought.spring.jobs.GitHubJob"/> 

</beans> 

शेड्यूलिंग यात्रा Spring Docs के बारे में अधिक जानकारी के लिए।

0

मुझे लगता है कि आपकी आवश्यकता केवल नियमित सेनारियो है जो क्वार्ट्ज या वसंत शेड्यूलिंग फ्रेमवर्क बहुत अच्छी तरह से समर्थन करता है। लेकिन आप इसे लागू करने के लिए एक spececial दृष्टिकोण बनाना चाहते हैं। मेरा सुझाव यह सरल और बेवकूफ रखना है। स्प्रिंग स्कीडलिंग आपके कार्यकर्ता धागे को हर समय चलाने के बजाए पूलिंग करके लाभ उठाएगी।

आंकड़ों के मुताबिक, कार्यकर्ता वर्ग के लॉग की जांच करना आसान है। यदि आप वेब कंसोल में आंकड़े देखना चाहते हैं, तो आपको डेटाबेस में कार्यकर्ता का लॉग रिकॉर्ड करना होगा। मुझे यकीन है कि आप इसे सामान्य तरीके से आसानी से बना सकते हैं।

4
@Scheduled(fixedDelay=3600000) 
private void refreshValues() { 
    [...] 
} 

यह हर घंटे एक बार काम करता है। इसे शून्य होना चाहिए और कोई तर्क स्वीकार नहीं करना चाहिए। यदि आप स्प्रिंग जावा कॉन्फ़िगरेशन का उपयोग करते हैं तो आपको अपने @Configuration कक्षाओं में से एक को एनोटेशन @EnableScheduling जोड़ने की भी आवश्यकता होगी।