प्रोग्राम को लंबे समय तक चलने की निगरानी कैसे करें


11

वर्तमान में मुझे जो मिला है उसे इस छद्म कोड के साथ सम्‍मिलित किया जा सकता है:

public static void Main(string[] args)
{
    var listOfObjects = Database.GetObjectsToUploadToOnlineService();
    Parallel.ForEach(Upload)
}

private static void Upload(MyUploadObject obj)
{
    //Build object (takes a few milliseconds)
    //Format to JSON (takes a few more milliseconds)
    //Upload (can take up to a max of 10 minutes)
    //Wait for a response (can take up to a max of 10 minutes)
    //Save response to our database (takes a few milliseconds)
}

यह कार्यक्रम निर्धारित कार्य के रूप में हमारे सर्वर पर सेट किया गया है। हम कार्यक्रम के मालिक हैं और हम जो चाहते हैं वह कर सकते हैं। मेरा प्रश्न स्वचालित निगरानी जाँच करने के बारे में एक ब्लॉग से उपजा है (मेरे पास लिंक काम नहीं है)।

इसलिए मुझे यह सोचने के लिए मिला: दुनिया में मैं अपने कार्यक्रम को कैसे संशोधित कर सकता हूं ताकि मैं एक और "निगरानी" कार्यक्रम को आग लगा सकूं? या यह एक WPF प्रोग्राम जो छिपा हुआ है, कहने के लिए कंसोल प्रोग्राम होने से बदल जाना चाहिए ?

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

कुल मिलाकर, मुझे लगता है कि मैं एक ऐसी खिड़की देखना चाहूंगा जो कुछ इस तरह कहे: अभी तक y की प्रक्रिया x, निम्नलिखित वस्तुओं पर कार्रवाई की जा रही है। आइटम, जैसे, एक तालिका में सूचीबद्ध करें और उन्हें "अपलोड करना" या "प्रतिक्रिया की प्रतीक्षा करना" जैसे कहें। शायद अगर मैं पागल हो जाऊं तो मैं यह भी कर सकता हूं कि कैसे विफल वस्तुओं की कतार (लेकिन यह सिर्फ अतिरिक्त होगा)।

मेरा मन एक घटना की ओर झुका रहता है, लेकिन मैं यह पता नहीं लगा सकता कि मैं एक कार्यक्रम कैसे चलाऊंगा जो सदस्यता ले सकता है और एक चल रहे कार्यक्रम को अनसब्सक्राइब कर सकता है। क्या यह भी संभव है?


क्या आप (10 मिनट तक चलने वाले) अपलोड / रिस्पांस ऑपरेशंस के अंदर की प्रगति की निगरानी करना चाहते हैं, या क्या आप जानना चाहते हैं कि "Parallel.ForEach" लूप के अंदर कितने अपलोड हुए हैं?
डॉक ब्राउन

@DocBrown संपादन देखें। (अंतिम दो पैराग्राफ)
रॉबर्ट स्नाइडर

1
मुझे लगता है कि आप क्या चाहते हैं शायद एक सरल यूडीपी रिसीवर प्रोग्राम है। आप नेटवर्क पर स्थिति पैकेट गिरा सकते हैं, और अगर उन्हें प्राप्त करने के लिए कुछ भी नहीं है, तो कोई नुकसान नहीं हुआ।
रॉबर्ट हार्वे

जवाबों:


7

आपको जो कुछ भी चाहिए वह आपके कार्यक्रमों के बीच संवाद करने का एक तरीका है जो उन्हें एक-दूसरे से नहीं जोड़ता है। ऐसा करने के कई तरीके हैं, आप कार्य को किसी फ़ाइल में लिख सकते हैं और फ़ाइल से रीड मॉनिटर करना होगा, कार्य को WCF के माध्यम से उपलब्ध कराएँ ताकि मॉनिटर परिवर्तनों के लिए 'पोल' कर सकें, नेटवर्क का उपयोग कर सकें ...

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


मुझे लगता है कि मैं इस जवाब के साथ जाने के लिए giong हूं क्योंकि हम पहले से ही अच्छी तरह से log4net का उपयोग करते हैं .. लॉगिंग :) तो यह अच्छी तरह से उसके पास फिट होगा। मेरे पास कोई सुराग नहीं था log4net ऐसा कर सकता था! धन्यवाद
रॉबर्ट स्नाइडर

9

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

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

बेशक, जब स्थिति तालिका में लिखना आपके डेटाबेस लेनदेन के साथ हस्तक्षेप करता है, तो आप एक अलग कनेक्शन का उपयोग कर सकते हैं। आप इसके लिए MSQM जैसे संदेश कतार तंत्र का भी उपयोग कर सकते हैं , लेकिन यह आपके साधारण मामले के लिए एक बड़ा समाधान हो सकता है।


+1 यह सरल रखने के लिए सबसे अच्छा तरीका है और ऐसा कुछ जटिल नहीं करना चाहिए जो बहुत जटिल न हो।
थॉमस स्ट्रिंगर

3

बस @ JDT के उत्तर को बनाने के लिए, यह करने के लिए एक सामान्य तरीका एक संदेश कतार में संदेश लिख रहा है। जब भी आपके आवेदन में कुछ महत्वपूर्ण होता है तो वह एक संदेश लिखता है और उसे संदेश कतार में भेज देता है। आमतौर पर संदेश का प्रारूप XML या समान होता है। यह कतार लेखक है।

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

यह आपके एप्लिकेशन को स्वयं मॉनिटर करने से रोकता है क्योंकि यह केवल संदेशों को निकाल रहा है। यह निगरानी एप्लिकेशन पर निर्भर करता है कि वर्तमान संदेशों के आधार पर यह निर्धारित किया जाए कि कुछ अच्छा या बुरा हुआ है। कतार का उपयोग किया जाता है क्योंकि वे बिना नुकसान के संदेशों को संग्रहीत करने के लिए एक अच्छा साधन प्रदान करते हैं।

यदि आपके एप्लिकेशन के कई इंस्टेंस चल रहे हैं तो आप केंद्रीयकृत संदेश भेजना चाहते हैं। यदि केवल 1 उदाहरण है, तो अन्य स्टोर जैसे विंडोज़ इवेंट लॉग या फ़ाइल का उपयोग करना पर्याप्त हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.