2009-08-23 18 views
26

मैं अपने एएसपी.नेट एमवीसी वेब ऐप में पृष्ठभूमि प्रोसेसिंग कतार कैसे कार्यान्वित कर सकता हूं? जबकि अधिकांश डेटा बदलते हैं, अपडेट इत्यादि को तत्काल दिखाई देने की आवश्यकता होती है, ऐसे अन्य अपडेट होते हैं जिन्हें वास्तविक समय प्रसंस्करण की आवश्यकता नहीं होती है जिसे मैं कम प्राथमिकता वाली पृष्ठभूमि प्रक्रिया को सौंपना चाहता हूं जो इसकी अपनी गति पर ध्यान रखेगा ।एएसपी.नेट एमवीसी वेब अनुप्रयोग में कतार आधारित पृष्ठभूमि प्रसंस्करण

उदाहरण के तौर पर, स्टैक ओवरफ्लो का बैज पुरस्कार प्रणाली लें। आम तौर पर आप एक विशिष्ट कार्रवाई कर सकते हैं जो आपको बैज प्रदान करेगी, लेकिन वास्तविक 'पुरस्कार' बाद में होता है (आमतौर पर 10 मिनट और कुछ घंटों के बीच)। मुझे लगता है कि यह एक अलग पृष्ठभूमि प्रक्रिया के माध्यम से किया जाता है क्योंकि अर्जित होने पर तत्काल बैज को पुरस्कृत करने के लिए एसओ के कार्यकलापों के लिए यह महत्वपूर्ण नहीं है।

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

मैं इस तरह के सिस्टम को लागू करने के बारे में कैसे जाउंगा? विचार/संकेत/नमूना कोड?

धन्यवाद!

उत्तर

20

विंडोज सेवा और एमएसएमक्यू उनके साथ संवाद करने के लिए (यदि आपको भी आवश्यकता है)।

-

थोड़ा विस्तार करने के लिए संपादित करें।

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

आप व्यवस्थापक दृष्टिकोण से उनके साथ बातचीत करना चाहते हैं, इसलिए आपके पास एक एमएसएमक्यू हो सकता है कि वे व्यवस्थापक आदेशों को सुनें। आपके कार्यान्वयन के आधार पर, आपको किसी कारण से उन्हें पुनरारंभ करने की आवश्यकता हो सकती है, या संभवतः वे जो कुछ भी करना चाहते हैं, उसे चलाने के लिए 'मजबूर' कर सकते हैं।

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

एमएसएमक्यू काफी सुंदर है। आप एक 'सहसंबंध आईडी' के आधार पर भेज सकते हैं आप की जरूरत है, लेकिन, कुछ मनोरंजक कारण के लिए, सहसंबंध आईडी के रूप में होना चाहिए:

{guid}\1 

और कुछ (काम नहीं करता है कम से कम 2.0 संस्करण में ढांचे के, कोड बदल गया हो सकता है)।

- संपादित करें

उदाहरण के लिए, के रूप में अनुरोध किया:

using System.Messaging; 

... 


MessageQueue queue = new MessageQueue(".\\Private$\\yourqueue"); 
queue.Formatter = new BinaryMessageFormatter(); 

Message m = new Message(); 
m.Body = "your serialisable object or just plain string"; 

queue.Send(m); 


// on the other side 

MessageQueue queue = new MessageQueue(".\\Private$\\yourqueue"); 
queue.Formatter = new BinaryMessageFormatter(); 

Message m = queue.Receive(); 

string s = m.Body as string; 

// s contains that string now 
+1

से इस महान लेख पढ़ें आप पर एक उदाहरण है कि कैसे शुरू में 'कनेक्ट' एक सेवा एक MSMQ साथ तो ASP.NET MVC के लिए आवेदन और के लिए? यह मेरे लिए बहुत नया है। धन्यवाद! – Alex

+0

आप बस उचित कतार में लिखते हैं। आपकी सेवा कॉल करेगी। रिसीव और आपका पेज, कि आप कतार में एक संदेश भेजना चाहते हैं, बस '.Send' को कॉल करेंगे। मैं एक छोटे से उदाहरण के साथ अद्यतन करेंगे। –

+0

अपडेट किया गया। नोट: यदि यह अस्तित्व में नहीं है, तो मैंने कतार बनाने के लिए कोड नहीं दिखाया है। लेकिन इसे सिस्टम में ले जाने के द्वारा ही मामूली रूप से पाया जा सकता है। मैसेजिंग एपीआई। विशेष रूप से: MessageQueue.Create (...)। ध्यान दें कि आपको उचित अनुमतियां भी प्राप्त करने की आवश्यकता होगी। (.SetPermissions)। –

10

जेफ एक महान दिखा कैसे वह http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

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

5

एएसपी.नेट एमवीसी में पृष्ठभूमि प्रक्रिया की खोज करते समय बस यह प्रश्न मिला। (.NET 4.5 के बाद उपलब्ध है।2)

public ActionResult InitiateLongRunningProcess(Emails emails) 
{ 
    if (ModelState.IsValid) 
    { 
     HostingEnvironment.QueueBackgroundWorkItem(ct => LongRunningProcessAsync(emails.Email)); 
     return RedirectToAction("Index", "Home"); 
    } 

    return View(user); 
} 

नोट: व्यक्तिगत रूप से मैं पृष्ठभूमि कार्यों को चलाने के लिए वेबसर्वर का उपयोग नहीं करूंगा। पहिया को फिर से न बदलें, मैं अत्यधिक Hangfire का उपयोग करने की सिफारिश करता हूं।

Hanselman HowToRunBackgroundTasksInASPNET

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