2013-01-10 23 views
5

मैं 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 सेकंड एक संकेत है कि हमारे पर्यावरण में कुछ ख़राब है?

+1

नोट: '24 एल * 3600 * 1000, टाइमयूनिट। मिलिस्सेन्ड्स '' 1, टाइमयूनीट.डेस' के बराबर है ... यह टाइम्यूनिट्स का पूरा बिंदु है: समय इकाई रूपांतरणों से परहेज करना! – assylias

+1

@assylias हां, लेकिन प्रारंभिक डेले डी मिलीसेकंड में है, और केवल एक टाइमयूनिट तर्क है। – Chris

+1

मैं क्वार्ट्ज या स्प्रिंग 'कार्य: अनुसूचित-कार्य 'का उपयोग करके एक विशिष्ट स्थानीय समय पर ट्रिगर करूंगा तो आपको यह समस्या नहीं है। – luukes

उत्तर

2

बहुत लंबे समय तक चलने वाले कार्य के लिए, यह आश्चर्यजनक नहीं है। आपके पास एक और समस्या यह है कि यह नैनोटाइम() का उपयोग करता है जो एनटीपी या इसी तरह के साथ सिंक्रनाइज़ नहीं होता है। इसके परिणामस्वरूप दीवार घड़ी के साथ बहाव हो सकता है।

इससे बचने का एक तरीका है जैसा कि आप सुझाव देते हैं बार-बार शेड्यूल करना है। दोहराने वाले कार्यों में वास्तव में खुद को फिर से निर्धारित किया जाता है (यही कारण है कि वे अपवाद नहीं फेंक सकते हैं, नीचे देखें) आपके पास एक शॉट शॉट हो सकता है जो दीवार घड़ी के समय का उपयोग करके और दिन की सूची बचत खाते में अंत में पुन: निर्धारित होता है।

बीटीडब्लू: मैं सुनिश्चित करता हूं कि आप अपवादों को पकड़ लें या यहां तक ​​कि थ्रोबल फेंक दें। यदि आप अपना काम नहीं रोकेंगे, संभवतः चुपचाप (जब तक आप भविष्य की वस्तु को वापस नहीं देख रहे हैं)

मैं जो कुछ करता हूं वह थोड़ा धोखा देता है। मेरे पास एक ऐसा कार्य है जो प्रत्येक 1 - 10 सेकेंड जागता है और जांच करता है कि उसे चलाने की आवश्यकता है और यदि रिटर्न नहीं मिलता है। यदि आपके पास हजारों कार्य नहीं हैं और इसे लागू करना बहुत आसान है तो ओवरहेड आमतौर पर छोटा होता है।

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

  • कोई संबंधित समस्या नहीं^_^