2015-05-20 13 views
17

क्या स्प्रिंग सेवा विधि को केवल एक बार निर्दिष्ट समय पर ही शेड्यूल करना संभव है? उदाहरण के लिए, वर्तमान समय 2 बजे है लेकिन जब मैं एक्शन बटन दबाता हूं तो मैं चाहता हूं कि मेरी सेवा विधि 8 बजे शुरू हो। मैं @ शेड्यूल्ड एनोटेशन से परिचित हूं और मुझे यकीन नहीं है कि क्रॉन अभिव्यक्ति को समय-समय पर चलाने के लिए कैसे लिखना है। यह एक @Scheduled(cron = "0 0 20 * * ?") हर दिन 8 बजे आग लगती है।
कोई सुझाव?स्प्रिंग शेड्यूलिंग कार्य - केवल एक बार चलाएं

+0

आप क्वार्ट्ज शेड्यूलर का उपयोग कर सकते हैं :) –

उत्तर

16

आप स्प्रिंग के टास्कशेड्यूलर के कार्यान्वयन में से एक का उपयोग कर सकते हैं। मैंने नीचे एक उदाहरण प्रदान किया है जिसके लिए बहुत अधिक विन्यास की आवश्यकता नहीं है (ConcurrentTaskScheduler जो एकल-थ्रेडेड निर्धारित निष्पादक को लपेटता है)।

सरलतम विधि अनुसूची कि एक Runnable और दिनांक केवल लेता नामित एक है। इससे कार्य निर्दिष्ट समय के बाद एक बार चलाएगा। अन्य सभी विधियां बार-बार चलाने के लिए कार्यों को शेड्यूल करने में सक्षम हैं।

private TaskScheduler scheduler; 

Runnable exampleRunnable = new Runnable(){ 
    @Override 
    public void run() { 
     System.out.println("Works"); 
    } 
}; 

@Async 
public void executeTaskT() { 
    ScheduledExecutorService localExecutor = Executors.newSingleThreadScheduledExecutor(); 
    scheduler = new ConcurrentTaskScheduler(localExecutor); 

    scheduler.schedule(exampleRunnable, 
      new Date(1432152000000L));//today at 8 pm UTC - replace it with any timestamp in miliseconds to text 
} 

... 

executeTaskT() //call it somewhere after the spring application has been configured 

नोट:

@EnableScheduling जोड़ने @Scheduled और @Async एनोटेशन के लिए समर्थन सक्षम और करने के लिए

के बारे में अधिक task execution & scheduling

सरल काम कर उदाहरण पढ़ें @EnableAsync आपके @ कॉन्फ़िगरेशनमें से एक के लिएकक्षाएं


अद्यतन - निर्धारित कार्य

TaskScheduler के समय विधि एक ScheduledFuture जो एक देरी परिणाम पैदा करने वाली क्रिया रद्द किया जा सकता है रिटर्न रद्द।

तो इसे रद्द करने के लिए, आपको शेड्यूल किए गए कार्य को संभालने की आवश्यकता है (यानी अनुसूचित भविष्य वापसी वस्तु रखें)। कोड को

परिवर्तन कार्य को रद्द करने के लिए ऊपर:

  1. अपने executeTaskT विधि बाहर ScheduledFuture घोषित। private ScheduledFuture scheduledFuture;

  2. जैसे वापसी वस्तु रखने के लिए शेड्यूल करने के लिए अपने कॉल संशोधित करें: scheduledFuture = scheduler.schedule(exampleRunnable, new Date(1432152000000L));

  3. कॉल नहीं करने के लिए अपने कोड boolean mayInterruptIfRunning = true; scheduledFuture.cancel(mayInterruptIfRunning);

+0

यह काम करता है। मैंने सर्वर थ्रेड प्रबंधन कार्य निष्पादक के साथ ConcurrentTaskScheduler त्वरण का विस्तार किया, जैसे कि 'शेड्यूलर = नया समवर्ती टास्कशेड्यूलर (workManagerTaskExecutor, Executors.newSingleThreadScheduledExecutor()) '। यह 'org.springframework.scheduling.commonj.WorkManagerTaskExecutor' का एक प्रकार है और सर्वर जेएनडीआई रजिस्टर द्वारा प्रदान किया जाता है। – shx

+1

ग्रेट, मेरे लिए काम किया। बीटीडब्ल्यू, यदि पैरामीटर के साथ चलने योग्य है, तो आप एक विधि लिख सकते हैं जो पैरामीटर स्वीकार कर रहा है और रननेबल लौटाता है और फिर पैरामीटर शेड्यूलर.schedule (createRunnable (param1), नई तिथि (1432152000000L) के साथ शेड्यूलर में इस विधि को पास करता है; –

+1

@Async इसे प्राप्त करने के लिए अनिवार्य है? – Angom

0

में कहीं scheduledFuture वस्तु पर रद्द करने के आदेश में प्रत्येक विधि कॉल पर ScheduledExecutorService और ConcurrentTaskScheduler बनाएं, सेवा निर्माण पर TaskScheduler प्रारंभ करना सुविधाजनक है, उदाहरण के लिए

private final TaskScheduler taskScheduler = 
       new ConcurrentTaskScheduler(Executors.newScheduledThreadPool(10)); 

@Async के रूप में हम सिर्फ विधि से कार्य और बाहर निकलने का समय निर्धारित कोई मतलब नहीं है।

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