2012-05-30 12 views
7

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

असल में, वांछित वास्तुकला इस के कुछ बदलाव है:

वेब एप्लिकेशन < -> Quartz.NET < -> डाटाबेस < -> Quartz.NET < -> Windows सेवा

मैंने अब तक कोड किया है:

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

और एक जोड़े को महत्वपूर्ण सूचनाएं:

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

अब, कुछ सवाल:

  1. यह और भी संभव है?
  2. मान लीजिए (1) गुजरता है, आप लोग क्या सोचते हैं इसके लिए सबसे अच्छा आर्किटेक्चर है? मैंने जो कोड किया है उस पर पहली बुलेट देखें।
  3. क्या कोई मुझे कुछ क्वार्ट्ज विधियां दे सकता है जो मुझे पहले से निर्धारित किए जाने के बाद नौकरियों को निष्पादित करने के लिए डीबी से पूछताछ करने में मदद करेगा?

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

+0

ठीक है, पहले कुछ प्रश्न हैं। आपके अनुसार क्वार्ट्ज नौकरी क्या है? मैंने इस पर कुछ त्वरित शोध किया और ऐसा लगता है कि एक क्वार्ट्ज.Net जॉब एक ​​इंटरफ़ेस का स्वयं लिखित इम्प्लेमेन्टेशन है। क्वार्ट्ज प्रोजेक्ट वह हिस्सा है जो शेड्यूलिंग करता है। मुख्य परियोजना पृष्ठ के अनुसार एडीओ.net के उपयोग के साथ नौकरियों को ओरेकल डेटाबेस में संग्रहीत किया जा सकता है। आपकी असली समस्या क्या है? – Remco

+0

ठीक है, मैं सिर्फ क्वार्ट्ज सामान को विभाजित करने का तरीका समझने की कोशिश कर रहा हूं ताकि एक इकाई उन्हें शेड्यूल कर दे और दूसरी इकाई उन्हें निष्पादित करे। आम तौर पर, मैं बस कुछ ऐसा करूंगा: _scheduler.ScheduleJob (jobDetail, ट्रिगर); लेकिन यह 'ट्रिगर' के आधार पर, हर बार स्वचालित रूप से आग लगने के लिए सेट करता है। मैं उस कार्यक्षमता को रखना चाहता हूं, लेकिन फ्लाई –

+0

पर नौकरियों को निर्धारित करने की कार्यक्षमता भी प्राप्त करता हूं और मेरे मामले में क्वार्ट्ज नौकरी एक विंडोज सेवा है जो सिस्टम –

उत्तर

25

मैं आपके प्रश्नों के उत्तर में आपके प्रश्नों का उत्तर देने का प्रयास करूंगा।

  1. हां, ऐसा करना संभव है। यह वास्तव में Quartz.Net के साथ काम करने का एक आम तरीका है। वास्तव में, आप एक एएसपी.NET एमवीसी एप्लिकेशन भी लिख सकते हैं जो क्वार्ट्ज.Net शेड्यूलर प्रबंधित करता है।

  2. आर्किटेक्चर। आदर्श रूप से और उच्च स्तर पर, आपका एमवीसी एप्लिकेशन Quartz.Net API का उपयोग क्वार्ट्ज.Net सर्वर से बात करने के लिए करेगा जो कहीं भी विंडोज सेवा के रूप में स्थापित है। क्वार्ट्ज।नेट दूरस्थ रूप से संवाद करने के लिए रिमोटिंग का उपयोग करता है, इसलिए रीमोटिंग का उपयोग करने की कोई सीमाएं लागू होती हैं (जैसे कि सिल्वरलाइट, आदि में समर्थित नहीं है)। Quartz.Net इसे बॉक्स से बाहर एक विंडोज सेवा के रूप में स्थापित करने का एक तरीका प्रदान करता है, इसलिए वास्तव में सेवा करने के लिए स्वयं को (आपके मामले में) AdoJobStore को कॉन्फ़िगर करने के अलावा, और सक्षम करने के अलावा वास्तव में बहुत कुछ नहीं किया जाना चाहिए दूरस्थ। सेवा को व्यवस्थित करने के तरीके के बारे में कुछ सावधानी बरतनी है, इसलिए यदि आपने अभी तक ऐसा नहीं किया है, तो at this post देखें।

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

public class QuartzScheduler 
{ 
    public QuartzScheduler(string server, int port, string scheduler) 
    { 
     Address = string.Format("tcp://{0}:{1}/{2}", server, port, scheduler); 
     _schedulerFactory = new StdSchedulerFactory(getProperties(Address)); 

     try 
     { 
      _scheduler = _schedulerFactory.GetScheduler(); 
     } 
     catch (SchedulerException) 
     { 
      MessageBox.Show("Unable to connect to the specified server", "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 
    } 
    public string Address { get; private set; } 
    private NameValueCollection getProperties(string address) 
    { 
     NameValueCollection properties = new NameValueCollection(); 
     properties["quartz.scheduler.instanceName"] = "RemoteClient"; 
     properties["quartz.scheduler.proxy"] = "true"; 
     properties["quartz.threadPool.threadCount"] = "0"; 
     properties["quartz.scheduler.proxy.address"] = address; 
     return properties; 
    } 
    public IScheduler GetScheduler() 
    { 
     return _scheduler; 
    } 
} 

यह कोड आपके Quart.Net क्लाइंट को सेट करता है।

public DataTable GetJobs() 
{ 
    DataTable table = new DataTable(); 
    table.Columns.Add("GroupName"); 
    table.Columns.Add("JobName"); 
    table.Columns.Add("JobDescription"); 
    table.Columns.Add("TriggerName"); 
    table.Columns.Add("TriggerGroupName"); 
    table.Columns.Add("TriggerType"); 
    table.Columns.Add("TriggerState"); 
    table.Columns.Add("NextFireTime"); 
    table.Columns.Add("PreviousFireTime"); 
    var jobGroups = GetScheduler().GetJobGroupNames(); 
    foreach (string group in jobGroups) 
    { 
     var groupMatcher = GroupMatcher<JobKey>.GroupContains(group); 
     var jobKeys = GetScheduler().GetJobKeys(groupMatcher); 
     foreach (var jobKey in jobKeys) 
     { 
      var detail = GetScheduler().GetJobDetail(jobKey); 
      var triggers = GetScheduler().GetTriggersOfJob(jobKey); 
      foreach (ITrigger trigger in triggers) 
      { 
       DataRow row = table.NewRow(); 
       row["GroupName"] = group; 
       row["JobName"] = jobKey.Name; 
       row["JobDescription"] = detail.Description; 
       row["TriggerName"] = trigger.Key.Name; 
       row["TriggerGroupName"] = trigger.Key.Group; 
       row["TriggerType"] = trigger.GetType().Name; 
       row["TriggerState"] = GetScheduler().GetTriggerState(trigger.Key); 
       DateTimeOffset? nextFireTime = trigger.GetNextFireTimeUtc(); 
       if (nextFireTime.HasValue) 
       { 
        row["NextFireTime"] = TimeZone.CurrentTimeZone.ToLocalTime(nextFireTime.Value.DateTime); 
       } 

       DateTimeOffset? previousFireTime = trigger.GetPreviousFireTimeUtc(); 
       if (previousFireTime.HasValue) 
       { 
        row["PreviousFireTime"] = TimeZone.CurrentTimeZone.ToLocalTime(previousFireTime.Value.DateTime); 
       } 

       table.Rows.Add(row); 
      } 
     } 
    } 
    return table; 
} 

आप इस कोड को देख सकते हैं: तो फिर दूरदराज के अनुसूचक उपयोग करने के लिए, बस फोन

GetScheduler() 
  1. यहाँ का पता कर रहा अनुसूचक से सभी नौकरियों को पाने के लिए कुछ नमूना कोड है Github

+0

अब यह एक अच्छा जवाब है! यह बहुत मदद की। आने के लिए, स्वीकार किया, और बक्षीस। –

+0

ओह- मुझे लगता है कि मैं यहां पर अपनी बकाया स्थिति को दूर करने के लिए थोड़ा सा समय लेना चाहता हूं –

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