2008-09-23 16 views
44

यदि आपको आवर्ती कार्यक्रमों का समर्थन करने वाले ईवेंट शेड्यूलिंग सिस्टम का निर्माण करने का कार्य सौंपा गया था, तो आप इसे कैसे करेंगे? आवर्ती घटना को हटाए जाने पर आप कैसे संभालेंगे? भविष्य की घटनाओं के दौरान आप कैसे देख सकते हैं?डिज़ाइन प्रश्न: आप आवर्ती ईवेंट सिस्टम कैसे डिज़ाइन करेंगे?

यानी कोई ईवेंट बनाते समय, आप "दैनिक दोहराना" (या साप्ताहिक, वार्षिक, आदि) चुन सकते हैं।

प्रति प्रतिक्रिया एक डिज़ाइन कृपया। मुझे रूबी/रेल के लिए उपयोग किया जाता है, लेकिन जो भी आप डिज़ाइन व्यक्त करना चाहते हैं उसका उपयोग करें।

मुझे यह एक साक्षात्कार में पूछा गया था, और मुझे वास्तव में अच्छी प्रतिक्रिया मिली जो मुझे पसंद आया।

नोट: already asked/answered here. था लेकिन जैसा कि नीचे वर्णन मैं, कुछ और अधिक व्यावहारिक जानकारी प्राप्त करने की उम्मीद कर रहा था:

  • यदि यह टिप्पणी या अन्यथा आवर्ती घटना का सिर्फ एक उदाहरण के लिए डेटा जोड़ने के लिए सक्षम होने के लिए जरूरी हो गया था , यह कैसे काम करेगा?
  • ईवेंट में परिवर्तन और हटाना कैसे काम करेगा?
  • भविष्य की घटनाओं के दौरान आप कैसे गणना करते हैं?
+1

मुझे इस सवाल से प्यार है, लेकिन मुझे संदेह है कि यह बंद हो जाएगा। –

+0

@ जो-वैन-डिक हे, मुझे एक ही समस्या है, क्या आप कृपया अपनी सिफारिशें जोड़ सकते हैं और उत्तर भाग में अपने गिट समाधान पर लिंक कर सकते हैं !? मेरा मानना ​​है कि आपने इस समस्या को हल किया है। मैं आम तौर पर डेटा मॉडल में दिलचस्प हूं। धन्यवाद – Sergii

उत्तर

0

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

जब एप्लिकेशन "जाग" यह जब गणना करेंगे घटना फिर से होनी चाहिए, इसे "घटनाक्रम" में संग्रहीत करें और फिर ईवेंट करें।

दोहराना।

यदि नींद सोते समय कोई घटना बनाई जाती है तो उसे बाधित किया जाता है और फिर से गणना की जाती है।

यदि ऐप नींद की घटना या इसी तरह से शुरू हो रहा है या ठीक हो रहा है, तो पास की घटनाओं के लिए "ईवेंट" जांचें और तदनुसार कार्य करें (जो आप मिस्ड इवेंट के साथ करना चाहते हैं) के आधार पर कार्य करें।

ऐसा कुछ लचीला होगा और अनावश्यक CPU चक्र नहीं लेगा।

+0

क्या आप भविष्य में देख सकते हैं और देख सकते हैं कि आगामी कार्यक्रम कब होंगे? –

2

मुझे इस परियोजना के डेटाबेस अंत का प्रबंधन करने से पहले ऐसा करना पड़ा था। मैंने अनुरोध किया कि प्रत्येक कार्यक्रम अलग घटनाओं के रूप में संग्रहीत किया जाए। यह आपको केवल एक घटना को हटाने की अनुमति देता है या आप एक अवधि को स्थानांतरित कर सकते हैं। एक घटना की कोशिश करने और संशोधित करने और इसे दो में बदलने के बजाय गुणकों को हटाने के लिए बहुत आसान है। तब हम एक और टेबल बनाने में सक्षम थे, जिसमें बस पुनरावृत्ति होती थी जिसमें पुनरावृत्ति की जानकारी शामिल थी।

0

मेरे सिर के ऊपर बंद (नीचे दिए कुछ लिखते समय/सोच में संशोधन के बाद):

न्यूनतम पुनरावृत्ति संकल्प की जरूरत निर्धारित; यह ऐप कितनी बार चलता है। शायद यह दैनिक है, शायद हर पांच मिनट।

प्रत्येक पुनरावर्ती घटना के लिए, सबसे हालिया रन टाइम, रन-अंतराल और अन्य उपहार जैसे कि वांछित समय की समाप्ति पर स्टोर करें।

हर बार जब ऐप चलता है, तो यह (आज/अब + पुनरावृत्ति पुनरुत्थान) की तुलना में सभी घटनाओं की जांच करता है (हाल ही में रनटाइम + रन इंटरवल) और यदि वे मेल खाते हैं, तो घटना को आग लगाना।

2

@ जो वैन डिक ने पूछा: "क्या आप भविष्य में देख सकते हैं और देख सकते हैं कि आगामी कार्यक्रम कब होंगे?"

आप करना चाहता है तो देखना/प्रदर्शन एक घटना के अगले n आवृत्तियां वे करना होगा या तो क) पहले से गणना की और कहीं या ख संग्रहित किया जा) मक्खी पर गणना की और का प्रदर्शन किया। यह किसी भी शाम ढांचे के लिए समान होगा।

ए के साथ नुकसान) यह है कि आपको कहीं पर इसकी सीमा तय करनी है और इसके बाद आपको बी का उपयोग करना होगा)। बस उपयोग करने के लिए आसान बी) शुरू करने के लिए।

शेड्यूलिंग सिस्टम को इस जानकारी की आवश्यकता नहीं है, इसे केवल अगले ईवेंट कब पता होना चाहिए।

+0

या दो मिश्रण। ऑन-डिमांड (बी) की गणना करें, फिर परिणामों को बाद में संदर्भ (ए) के लिए स्टोर करें। –

0

जब मैंने अपने लिए मिंबल साल पहले कैलेंडर ऐप लिखा था, तो मैंने मूल रूप से केवल क्रॉन से शेड्यूलिंग तंत्र चुरा लिया और आवर्ती घटनाओं के लिए इसका उपयोग किया। उदाहरण के लिए, जनवरी को छोड़कर हर महीने के दूसरे शनिवार को होने वाली कुछ जानकारी में "दोहराना = * 2-12 8-14 6" (हर साल, महीने 2-12, दूसरा सप्ताह 8 वें से 14 वें तक चलता है, और शनिवार के लिए 6 क्योंकि मैंने सप्ताह के दिनों के लिए 0-आधारित संख्या का उपयोग किया था)।

हालांकि यह निर्धारित करने में काफी आसान बनाता है कि घटना किसी भी तिथि पर होती है, यह "हर एन दिनों" पुनरावृत्ति को संभालने में सक्षम नहीं है और यह उन उपयोगकर्ताओं के लिए सहज नहीं है जो यूनिक्स-समझदार नहीं हैं।

व्यक्तिगत घटना के उदाहरणों और हटाने/रीशेड्यूलिंग के लिए अद्वितीय डेटा से निपटने के लिए, मैंने अभी ट्रैक किया है कि डेटाबेस में परिणामी घटनाओं के लिए कितनी दूर की घटनाओं की गणना की गई है और संग्रहीत किया गया है, जहां उन्हें संशोधित, स्थानांतरित किया जा सकता है, या मूल आवर्ती घटना की जानकारी को प्रभावित किए बिना हटा दिया गया। जब एक नई आवर्ती घटना को जोड़ा गया, तो सभी उदाहरणों की तुरंत "पिछली गणना" तिथि तक गणना की गई।

मुझे कोई दावा नहीं है कि यह करने का यह सबसे अच्छा तरीका है, लेकिन यह तरीका है, और जो पहले उल्लेख किया गया सीमाओं के भीतर काफी अच्छी तरह से काम करता है।

0

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

:)

// डब्ल्यू

+1

वेब एप्लिकेशन के लिए काम नहीं करता है –

9

मैं outlined by Martin Fowler के रूप में कुछ अस्थायी अभिव्यक्ति को लागू करने से शुरू कर दिया। यह निर्धारित करने का ख्याल रखता है कि एक निर्धारित आइटम वास्तव में कब होना चाहिए। यह करने का यह एक बहुत ही शानदार तरीका है। जो मैंने समाप्त किया वह सिर्फ लेख में जो कुछ है, उसका निर्माण था।

अगली समस्या यह पता लग रही थी कि दुनिया में अभिव्यक्तियों को कैसे स्टोर किया जाए। दूसरी समस्या यह है कि जब आप अभिव्यक्ति को पढ़ते हैं, तो वे इतने गतिशील उपयोगकर्ता इंटरफ़ेस में कैसे फिट होते हैं?अभिव्यक्तियों को केवल बीएलओबी में क्रमबद्ध करने की बात थी, लेकिन अभिव्यक्ति के पेड़ को यह जानना मुश्किल होगा कि इसका क्या अर्थ था।

समाधान (मेरे मामले में) पैरामीटर को स्टोर करना है जो यूजर इंटरफेस का समर्थन करने वाले सीमित संख्या में फिट बैठता है, और वहां से, उस जानकारी का उपयोग फ्लाई पर टेम्पोरल एक्सप्रेशन उत्पन्न करने के लिए करें (अनुकूलन के लिए बनाए जाने पर क्रमबद्ध किया जा सकता है)। इसलिए, अनुसूची वर्ग ऑफसेट, प्रारंभ तिथि, समाप्ति तिथि, सप्ताह का दिन, और इसी तरह के कई पैरामीटर समाप्त होता है ... और इससे आप कड़ी मेहनत करने के लिए टेम्पोरल अभिव्यक्तियां उत्पन्न कर सकते हैं।

कार्यों के उदाहरण होने के लिए, एक 'सेवा' है जो एन दिनों के लिए कार्य उत्पन्न करती है। चूंकि यह मौजूदा प्रणाली के लिए एकीकरण है और सभी मामलों की आवश्यकता है, यह समझ में आता है। हालांकि, इस तरह की एक एपीआई आसानी से सभी उदाहरणों को संग्रहीत किए बिना आवर्ती प्रोजेक्ट करने के लिए उपयोग की जा सकती है।

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