मैं ScheduledExecutorService.scheduleAtFixedRate
का प्रयोग कर एक दैनिक कार्य को चलाने के लिए, इस तरह:शुद्धता/JVM
executor.scheduleAtFixedRate(task, d, 24L * 3600 * 1000, TimeUnit.MILLISECONDS);
(d
मिलीसेकेंड में प्रारंभिक देरी है)।
निष्पादक Executors.newSingleThreadScheduledExecutor()
द्वारा बनाया गया है और कई कार्यों को चलाता है, लेकिन वे सभी कुछ घंटों के अलावा निर्धारित हैं, और कुछ ही मिनटों में लेते हैं।
मुझे पता है कि ScheduledExecutorService सटीकता के बारे में कोई गारंटी नहीं देता है, और मुझे इसे प्राप्त करने के लिए एक वास्तविक समय ओएस और JVM की आवश्यकता होगी। हालांकि, मेरे काम के लिए यह एक आवश्यकता नहीं है।
मैंने देखा कि विंडोज 2003 सर्वर पर, जेडीके 1.7.0_03 का उपयोग करके, कार्य प्रति दिन लगभग 10 सेकंड तक गिर जाता है। यह प्रति माह लगभग 5 मिनट बनाता है, जो मेरे आवेदन के लिए स्वीकार्य है। मुझे शायद फिर से शेड्यूलिंग को लागू करना होगा, क्योंकि मैं कार्य को एक विशिष्ट स्थानीय समय पर चलाने के लिए चाहता हूं, और इसलिए मुझे स्वयं डीएसटी का ख्याल रखना होगा। सेवा लंबे समय तक चलती है - आधा साल बिना पुनरारंभ किए असामान्य नहीं है।
फिर भी, मुझे लगता है कि अधिकतर निष्क्रिय सिस्टम के लिए 10 सेकंड/दिन की गलतता अधिक है, और मुझे आश्चर्य है कि मुझे और भी बदतर व्यवहार के लिए तैयार रहना चाहिए।
तो मेरा प्रश्न scheduleAtFixedRate
के साथ आपके अनुभवों के बारे में है। क्या 10 सेकंड/दिन सामान्य है? क्या मुझे अन्य वातावरण में बेहतर या खराब सटीकता मिल जाएगी (हमारे ग्राहक लिनक्स और सोलारिस सर्वर का भी उपयोग करते हैं)? या 10 सेकंड एक संकेत है कि हमारे पर्यावरण में कुछ ख़राब है?
नोट: '24 एल * 3600 * 1000, टाइमयूनिट। मिलिस्सेन्ड्स '' 1, टाइमयूनीट.डेस' के बराबर है ... यह टाइम्यूनिट्स का पूरा बिंदु है: समय इकाई रूपांतरणों से परहेज करना! – assylias
@assylias हां, लेकिन प्रारंभिक डेले डी मिलीसेकंड में है, और केवल एक टाइमयूनिट तर्क है। – Chris
मैं क्वार्ट्ज या स्प्रिंग 'कार्य: अनुसूचित-कार्य 'का उपयोग करके एक विशिष्ट स्थानीय समय पर ट्रिगर करूंगा तो आपको यह समस्या नहीं है। – luukes