2010-05-11 12 views
10

मेरे पास एएसपीनेट (एमवीसी) वेबसाइट है। कार्यों के हिस्से के रूप में मुझे कुछ लंबे समय तक चलने वाले संचालन का समर्थन करना होगा, उदाहरण के लिए:वेब (एएसपीनेट) पर्यावरण में लंबे समय तक चलने वाले ऑपरेशन (थ्रेड)

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

इस ऑपरेशन का अक्सर उपयोग नहीं किया जाएगा, लेकिन ऐसा हो सकता है कि एक ही समय में दो उपयोगकर्ता डेटा आयात करने का प्रयास करेंगे। आयात समानांतर में चलाने के लिए अच्छा होगा। शुरुआत में मैं आईआईएस (नियंत्रक कार्रवाई) में एक नया धागा बनाने और एक नए धागे में आयात चलाने के लिए सोच रहा था। लेकिन मुझे यकीन नहीं है कि यह एक अच्छा विचार है (वेब ​​सर्वर पर काम करने वाले धागे बनाने के लिए)। क्या मुझे विंडोज सेवाओं या किसी अन्य दृष्टिकोण का उपयोग करना चाहिए?

सिस्टम से शुरू: - मुझे समय-समय पर नए डेटा के साथ ल्यूसीन इंडेक्स अपडेट करना होगा। - मुझे बड़े पैमाने पर ईमेल भेजना होगा (भविष्य में)।

क्या मुझे साइट पर नौकरी के रूप में इसे लागू करना चाहिए और Quartz.net के माध्यम से नौकरी चलाएं या क्या मुझे विंडोज़ सेवा या कुछ भी बनाना चाहिए?

साइट "नौकरियां" चलाने के लिए सबसे अच्छा प्रथा क्या है?

धन्यवाद!

+0

एक संबंधित सवाल http://stackoverflow.com/a/41734936/56145 –

उत्तर

6

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

  • ग्राहक वेब सर्वर करने के लिए सभी आवश्यक जानकारी भेजता है

  • सेवा के लिए वेब सर्वर प्रतिनिधियों कार्य और सूचित करता है ग्राहक:

    तो आम परिदृश्य निम्नलिखित लग सकता है (टास्क आईडी क्लाइंट को भी भेजा जाता है)

  • बाहरी सेवा कार्य प्रसंस्करण शुरू करती है, प्रगति सूचना अद्यतन करना एन।

  • क्लाइंट काम के बारे में कम निष्पादन अनुरोध के साथ मतदान वेब सर्वर शुरू होता है (आईडी के साथ पहले प्राप्त) स्थिति और प्रगति।

आप विभिन्न प्रौद्योगिकियों (Windows सेवा + DB/WCF सेवा) और विभिन्न संचार दृष्टिकोण चुन सकते हैं (मतदान, धक्का, कॉलबैक) लेकिन मैं बाहरी सेवा से लंबे समय से चल रहे कार्यों को सौंपने के लिए सलाह देने के लिए (वेब ​​के भीतर उन्हें प्रदर्शन नहीं एप्लिकेशन)।

लंबे समय तक चलने वाले कार्यों को निष्पादित करना थ्रेड-प्रति-अनुरोध मॉडल (बहुप्रचारित प्रोग्रामिंग शब्दों में) लाता है। इस मॉडल में खराब स्केलेबिलिटी और थ्रेड पूल थ्रेड सीमाओं की अधिकतम संख्या है। हालांकि यह आपका मामला नहीं है :)

+0

मैं में भारी रूपांतरण, रिपोर्ट पीढ़ियों, डेटा पीढ़ियों करते थे पर इन उत्तरों से कुछ पर विचार करें इस तरह से। यह एकमात्र तार्किक पसंद है। –

4

मेरी राय में लंबे समय तक चलने वाले कार्यों को आम तौर पर हमेशा गैर यूआई आधारित संचालन में नियुक्त किया जाना चाहिए। मैं शायद एक डब्ल्यूएफ या विंडो सेवा का सुझाव दूंगा।

1

मैंने jQuery का उपयोग करके इस तरह के एक परिदृश्य को सफलतापूर्वक कार्यान्वित किया है। मूल रूप से, मैं beforeSend का उपयोग करता हूं: 'कृपया प्रतीक्षा करें' प्रकार पृष्ठ प्रदर्शित करने के लिए फ़ंक्शन। यहाँ खेलने में बुनियादी कोड है (altso मैं नहीं करते हैं, आप भी कार्रवाई async बनाने के लिए AsyncController आधार वर्ग इस्तेमाल कर सकते हैं):

<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#create').bind('click', function() { 
      saveFundProperty(); 
     }); 
    }); 

    // main functions 
    function saveFundProperty() { 
     var url = '<%= Url.Action("Create", "FundProperty") %>'; 
     var params = { fundId: $("#FundID").val(), propertyId: $("#PropertyID").val() }; 
     SendAjax(url, params, beforeQuery, saveFundPropertyResponse); 
    } 

    function beforeQuery() { 
     var url = '<%= Url.Action("Wait", "FundProperty") %>'; 
     $("#statusMsg").load(url); 
    } 

    function saveFundPropertyResponse(data) { 
     if (data.length != 0) { 
      if (data.indexOf("ERROR:") >= 0) { 
       $("#statusMsg").html(data).css('backgroundColor','#eeaa00'); 
      } 
      else { 
       $("#statusMsg").html(data); 
      } 
     } 
    } 
</script> 

आशा है कि यह मदद करता है।

SendAjax विधि चीजों को थोड़ा अधिक संगत बनाने के लिए पूरी तरह से एक रैपर फ़ंक्शन है। यहाँ यह पूर्ण में है:

<script type="text/javascript"> 
function SendAjax(urlMethod, jsonData, beforeSendFunction, returnFunction, dataType, contentType) { 
    $.ajaxSetup({ cache: false }); 
    dataType = dataType || "text"; // default return type 
    contentType = contentType || "application/x-www-form-urlencoded"; // default input type 
    $.ajax({ 
     type: "POST", 
     url: urlMethod, 
     data: jsonData, 
     dataType: dataType, 
     contentType: contentType, 
     beforeSend: function() { 
      if(beforeSendFunction!==null) 
       beforeSendFunction(); 
     }, 
     success: function(data) { 
      // Do something interesting here. 
      if (data != null && returnFunction!==null) { 
       returnFunction(data); 
      } 
     }, 
     error: function(xhr, status, error) { 
      // Boil the ASP.NET AJAX error down to JSON. 
      var err = eval("(" + xhr.responseText + ")"); 

      // Display the specific error raised by the server 
      alert(err.Message); 
     } 
    }); 
} 
</script> 

[संपादित करें] - यकीन नहीं क्या SendAjax स्वरूपण के साथ हो रहा है। आशा है कि यह कॉपी/पेस्ट बाहर करने के लिए आसान है ...

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