asp.net अनुसूचित कार्यों को चलाने का सबसे अच्छा तरीका




windows iis (13)

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

इसे चलाने का एक और सुविधाजनक तरीका पिंगडम जैसे निगरानी सेवा का उपयोग करना है। अपने http चेक को उस पृष्ठ पर इंगित करें जो आपका सेवा कोड चलाता है। पेज रिटर्न परिणाम प्राप्त करें, जिसका उपयोग पिंगडम ट्रिगर करने के लिए किया जा सकता है ताकि चेतावनी संदेश भेजने के लिए कुछ सही न हो।

आज हमने अपनी एएसपी.नेट वेबसाइट के लिए निर्धारित कार्यों को चलाने के लिए एक कंसोल एप्लिकेशन बनाया है। लेकिन मुझे लगता है कि यह दृष्टिकोण थोड़ी सी त्रुटि प्रवण है और बनाए रखना मुश्किल है। आप अपने निर्धारित कार्य को कैसे निष्पादित करते हैं (विंडोज़ / आईआईएस / एएसपी.नेट पर्यावरण में)

अद्यतन करें:

कार्यों के उदाहरण:

  • डेटाबेस में ईमेल-कतार से ईमेल भेजना
  • डेटाबेस से पुरानी वस्तुओं को हटा रहा है
  • Google AdWords से आंकड़े पुनर्प्राप्त करना और डेटाबेस में एक तालिका भरें।

पहिया को फिर से शुरू करें, थ्रेडिंग और टाइमर वर्ग का उपयोग करें।

    protected void Application_Start()
    {
        Thread thread = new Thread(new ThreadStart(ThreadFunc));
        thread.IsBackground = true;
        thread.Name = "ThreadFunc";
        thread.Start();
    }

    protected void ThreadFunc()
    {
        System.Timers.Timer t = new System.Timers.Timer();
        t.Elapsed += new System.Timers.ElapsedEventHandler(TimerWorker);
        t.Interval = 10000;
        t.Enabled = true;
        t.AutoReset = true;
        t.Start();
    }

    protected void TimerWorker(object sender, System.Timers.ElapsedEventArgs e)
    {
        //work args
    }

.NET के लिए एक नया कार्य शेड्यूलर क्लास लाइब्रेरी

नोट: चूंकि यह लाइब्रेरी बनाई गई थी, इसलिए माइक्रोसॉफ्ट ने विंडोज विस्टा के लिए एक नया कार्य शेड्यूलर (टास्क शेड्यूलर 2.0) पेश किया है। यह लाइब्रेरी कार्य शेड्यूलर 1.0 इंटरफ़ेस के लिए एक रैपर है, जो अभी भी Vista में उपलब्ध है और Windows XP, Windows Server 2003 और Windows 2000 के साथ संगत है।

http://www.codeproject.com/KB/cs/tsnewlib.aspx


यदि आपके पास सर्वर है तो आपको विंडोज़ टास्क शेड्यूलर का उपयोग करना चाहिए। एटी / का प्रयोग करें? विकल्पों को देखने के लिए कमांड लाइन से।

अन्यथा, एक वेब आधारित वातावरण से, आपको कुछ अंतराल पर किसी निश्चित पृष्ठ पर अनुरोध करने के लिए एक अलग मशीन सेट करने की तरह कुछ बुरा करना पड़ सकता है।


आप आसानी से एक विंडोज सेवा बना सकते हैं जो 'ThreadPool.RegisterWaitForSingleObject' विधि का उपयोग करके अंतराल पर कोड चलाता है। यह वास्तव में चिकना है और स्थापित करने के लिए काफी आसान है। फ्रेमवर्क में किसी भी टाइमर का उपयोग करने के लिए यह विधि एक और सुव्यवस्थित दृष्टिकोण है।

अधिक जानकारी के लिए नीचे दिए गए लिंक पर नज़र डालें:

विंडोज सेवा का उपयोग कर .NET में एक आवधिक प्रक्रिया चलाना:
http://allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html


मुझे यकीन नहीं है कि आप किस तरह के निर्धारित कार्यों का मतलब है। यदि आपका मतलब है "हर घंटे, foo.xml रीफ्रेश करें" प्रकार के कार्यों, तो विंडोज अनुसूचित कार्य प्रणाली का उपयोग करें। ("At" कमांड, या नियंत्रक के माध्यम से।) क्या यह या तो एक कंसोल ऐप चलाता है या किसी विशेष पृष्ठ का अनुरोध करता है जो प्रक्रिया को बंद कर देता है।

संपादित करें: मुझे जोड़ना चाहिए, यह आपके आईआईएस ऐप को निर्धारित बिंदुओं पर भी चलाने का एक अच्छा तरीका है। तो मान लीजिए कि आप हर 30 मिनट में अपने डीबी को जांचना चाहते हैं और कुछ डेटा के बारे में उपयोगकर्ताओं को ईमेल अनुस्मारक ईमेल करना चाहते हैं, तो आप इस पृष्ठ का अनुरोध करने के लिए अनुसूचित कार्यों का उपयोग कर सकते हैं और इसलिए आईआईएस प्रोसेसिंग चीजें प्राप्त कर सकते हैं।

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


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


जेक एटवुड फॉर स्टैक ओवरफ्लो द्वारा यह तकनीक सबसे आसान तरीका है जो मैंने पार किया है। यह एएसपी.NET के कैश सिस्टम में "कैश आइटम हटा दिया गया" कॉलबैक तंत्र पर निर्भर करता है

अद्यतन: इस विधि को बढ़ा दिया है। यह केवल तभी काम करता है जब वेबसाइट चल रही है लेकिन यह एक बहुत ही सरल तकनीक है जो कई लोगों के लिए उपयोगी है।

Quartz.NET भी देखें


एक कस्टम विंडोज सेवा बनाएँ।

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

ऐसा कहकर, मैं अभी भी अपने अधिकांश गैर-महत्वपूर्ण रखरखाव कार्यों के लिए अनुसूचित कंसोल ऐप्स का उपयोग करता हूं। यदि यह तोड़ नहीं है, तो इसे ठीक न करें।


यह पुस्तकालय एक आकर्षण की तरह काम करता है http://www.codeproject.com/KB/cs/tsnewlib.aspx

यह आपको सीधे अपने .NET कोड के माध्यम से विंडोज शेड्यूल किए गए कार्यों को प्रबंधित करने की अनुमति देता है।


एक वेब पेज चलाने के लिए विंडोज शेड्यूलर का प्रयोग करें।

दुर्भावनापूर्ण उपयोगकर्ता या खोज इंजन मकड़ियों को चलाने के लिए इसे रोकने के लिए, जब आप शेड्यूल किए गए कार्य को सेट करते हैं, तो बस वेब पेज को क्वेरीस्ट्रिंग के साथ कॉल करें, यानी: mypage.aspx? से = scheduletask

फिर पेज लोड में, बस एक शर्त का उपयोग करें: यदि (Request.Querystring ["from"] == "settask") {// executetask}

इस प्रकार कोई खोज इंजन स्पाइडर या दुर्भावनापूर्ण उपयोगकर्ता आपके निर्धारित कार्य को निष्पादित करने में सक्षम नहीं होगा।


एक विकल्प विंडोज़ सेवा स्थापित करना होगा और इसे अपने निर्धारित कार्य को कॉल करने के लिए प्राप्त करना होगा।

Winforms में मैंने टाइमर का इस्तेमाल किया है, ऐसा नहीं लगता कि यह एएसपी.नेट में अच्छी तरह से काम करेगा


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

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

उम्मीद है कि उन सुझावों में मदद करें।





scheduled-tasks