अनुसूचित कार्यों को चलाने का सबसे अच्छा तरीका [बंद]


229

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

अपडेट करें:

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

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

आपके द्वारा चलाए जा रहे कार्यों का एक उदाहरण क्या है?
जेएफओ

4
आपको atrigger.com
Kousha

यदि आपके पास Plesk है, तो आप एक vbs लिख सकते हैं और इसे टास्क शेड्यूलर में ऐड
हसन

जवाबों:


74

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

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


3
यह वह समाधान है जिसके साथ मैं समाप्त हुआ। एक कस्टम वेब सेवा के बजाय मैं विंडोज़ अनुसूचक + कर्ल का उपयोग करता हूं। विंडोज़ सेवा का उपयोग करने का क्या लाभ है।
नील्स बोसमा

16
क्या आपने कैश आइटम समाप्ति तकनीक को देखा है? मुझे लगता है कि आप पाएंगे कि यह अनुसूचित सेवा का एक बहुत अधिक आदर्श कार्यान्वयन है: codeproject.com/KB/aspnet/ASPNETService.aspx
रिचर्ड क्लेटन

10
एक दुर्भावनापूर्ण उपयोगकर्ता (या एक खोज इंजन मकड़ी) को इस पृष्ठ को कॉल करने से रोकने के लिए क्या है, और इस कारण आपके निर्धारित कार्य चलने लगते हैं?
8

8
आप वेब ऐप में स्टैटिक टाइमस्टैम्प स्टोर करके दुर्भावनापूर्ण कॉल को रोक सकते हैं और केवल तभी चला सकते हैं जब टाइमस्टैम्प सेट नहीं किया गया हो (पहला कॉल) या अंतिम कॉल के बाद से सही समय समाप्त हो गया हो।
रोब केंट

5
मैं अपने url के लिए दुर्भावनापूर्ण कॉलों की जाँच करके रोक देता हूं कि क्या IP पता एक आंतरिक पता है या नहीं। यह कुछ भी नहीं देता है और कुछ भी नहीं करता है अगर यह हमारे संगठन के लिए आंतरिक नहीं है।
user1408767

128

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

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

इसके अलावा Quartz.NET को देखें


12
यदि आवेदन नहीं चल रहा है तो क्या होगा, लेकिन निर्धारित कार्य होने की आवश्यकता है?
माइकलजी

2
यदि इस समय को चलाने में कुछ समय लगता है, तो यह उपयोगकर्ता के अनुभव को धीमा कर सकता है। मुझे लगता है कि उपयोगकर्ता ने मेरे रखरखाव / कार्यों को मेरे लिए नहीं रखा है।
ब्रेट्स्की

5
यह नरक के रूप में डरावना है! कुछ भी एप्लिकेशन को चलने से रोकने का कारण हो सकता है और यह संभवतः केवल अगले उपयोगकर्ता अनुरोध पर पुनः आरंभ करेगा। उन समयों के बीच, आपके कार्य नहीं चलते हैं!
तेयदेय

43
मूल ब्लॉग पोस्ट की टिप्पणियों में आज मैंने कुछ देखा: No, we’ve switched to a dedicated task. We definitely outgrew this technique. I do think it’s fine for small sites though!- जेफ एटवुड
जोएल कोएहॉर्न

3
-1 इस दृष्टिकोण के साथ एक बड़ा दोष है। जब भी एप्लिकेशन को 'CacheItemRemoved' ईवेंट फायर किया जाता है और आपका निर्धारित कार्य चलेगा। उत्पादन साइटों पर यह दिन में कुछ बार हो सकता है। यदि आप साप्ताहिक काम चलाना चाहते हैं तो इतना अच्छा नहीं है।
स्टीवन डी सलास

30

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

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

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


7
FYI करें लिंक अब मृत है।
चार्ल्स बर्न्स

1
: @CharlesBurns, आप हमेशा मृत लिंक archive.org साथ ब्राउज़ कर सकते हैं web.archive.org/web/20090919131944/http://www.dotheweb.net/...
निकोले कोस्तोव

17

मैंने पाया है कि इसमें सभी शामिल होना आसान है:

  • DoSuchAndSuchProcess जैसे एक webservice विधि बनाएँ
  • एक कंसोल ऐप बनाएं जो इस वेबमिथोड को कॉल करता है।
  • कार्य शेड्यूलर में कंसोल ऐप को शेड्यूल करें।

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


10

पहिया को क्यों मजबूत करें, थ्रेडिंग और टाइमर वर्ग का उपयोग करें।

    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
    }

7
टाइमर शुरू करने के लिए आपको थ्रेड स्पॉन की आवश्यकता नहीं है ...
ज़ोया

4
मुझे भी नहीं लगता कि यह एक आदर्श समाधान है।
इदन शेखर

12
@IdanShechter एक कारण बताना अच्छा होगा कि आप इसे एक आदर्श समाधान क्यों नहीं मानते हैं
ओमू

2
थ्रेड समस्याग्रस्त हो सकता है, क्योंकि यह HttpRequest नहीं है, HttpRequest से जुड़े कुछ डेटा शून्य हो सकते हैं। उदाहरण के लिए HttpRequest .ApplicationPath। यदि कार्य ठीक से लिखा गया है, तो यह काम करेगा। एक अन्य समस्या अनुप्रयोग पूल पुनरारंभ है। यदि पूल बहुत बार पुनरारंभ हो रहा है (मेमोरी लीक ...), तो कार्यकर्ता कभी नहीं चलेगा।
टॉमस क्यूब्स

2
यदि आपके पास कई उदाहरण चल रहे हैं (उदाहरण के लिए लोड संतुलन) - शायद आप इस समाधान (कई कार्यों को समान करना) नहीं चाहते हैं
इलिडन

8

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

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

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

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


5
बेहतर अभी तक, एक नमकीन हैशिंग एल्गोरिथ्म का उपयोग करें जो वास्तव में एक जादुई वाक्यांश की तुलना में थोड़ी अधिक सुरक्षा के साथ querystring की पुष्टि करता है। Req mypage.aspx की तरह कुछ होगा? नमक = foo & hash = 1223523jbhdgu13t1। आपको बस सर्वर और क्लाइंट दोनों पर एक ही हैशिंग एल्गोरिदम रखना होगा। सर्वर पर एक कठिन सीमा भी जोड़ें; बचाने के लिए जब इसे निष्पादित किया गया था और बहुत तेज़ी से निष्पादित करने से रोकें। मैं हालांकि पागल हो सकता हूं।
नेनोटलेप

14
और भी अधिक सुरक्षित, वेब पेज चलाने के लिए विंडोज शेड्यूलर का उपयोग करें जो यह जांचता है कि क्या अनुरोध सर्वर से ही आ रहा है: Request.IsLocal>> केवल सर्वर ही निर्धारित कार्यों को चला सकता है, कोई और नहीं।
द कंसपिरेशन

क्या आपके पास अपने दृष्टिकोण से अधिक अनुभव हैं? मैं अपने ऐप की समान प्रकार की सेवा विकसित करने जा रहा था और अब मैं यह तय नहीं कर सकता कि क्या यह निर्धारित कार्य या क्रोन के साथ एक पृष्ठ को कॉल करना बेहतर है, या यदि कैश सिस्टम का उपयोग करना है।
JayDee

4

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

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


3

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


2

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

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

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


2

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

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


2

मैंने ASP.NET प्रोजेक्ट (यहाँ कुछ पृष्ठभूमि की जानकारी ) में सफलतापूर्वक Abidar का उपयोग किया है ।

इस विधि के साथ एकमात्र समस्या यह है कि ASP.NET वेब एप्लिकेशन मेमोरी से अनलोड (यानी कम उपयोग के कारण) होने पर कार्य नहीं चलेगा। एक चीज़ जो मैंने कोशिश की, वह वेब एप्लिकेशन को हर 5 मिनट में हिट करने के लिए एक कार्य बना रही है, इसे जीवित रखते हुए, लेकिन यह मज़बूती से काम नहीं करता है, इसलिए अब मैं विंडोज शेड्यूलर और बेसिक कंसोल एप्लिकेशन का उपयोग इसके बजाय कर रहा हूं।

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


1

यहाँ एक और तरीका है:

1) एक "दिल की धड़कन" वेब स्क्रिप्ट बनाएं जो कार्यों को लॉन्च करने के लिए ज़िम्मेदार है अगर वे DUE या अतिदेय लॉन्च किए जाने वाले हैं।

2) कहीं पर एक निर्धारित प्रक्रिया बनाएं (उसी वेब सर्वर पर अधिमानतः) जो वेबसस्क्रिप्ट को हिट करता है और इसे एक नियमित अंतराल पर चलाने के लिए मजबूर करता है। (उदाहरण के लिए विंडोज़ शेड्यूल टास्क जो चुपचाप IE या व्हाट्सएव का उपयोग करके हीटबीट स्क्रिप्ट लॉन्च करता है)

यह तथ्य कि वेब कोड के भीतर टास्क कोड निहित है, शुद्ध रूप से कोड को वेब एप्लिकेशन कोड-बेस के भीतर रखने के लिए है (धारणा यह है कि दोनों एक-दूसरे पर निर्भर हैं), जो वेब डेवलपर्स के लिए प्रबंधन करना आसान होगा ।

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


1
@Matias, क्यों नहीं निर्धारित प्रक्रिया के बजाय असली काम करते हैं?
ल्यूक

1

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

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

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


0

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

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

आशा है कि उन सुझावों में मदद मिलेगी।


0

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

Winforms में मैंने टाइमर का उपयोग किया है, यह मत सोचो कि यह ASP.NET में अच्छा काम करेगा


-1

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

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

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


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