2012-09-19 22 views
10

में सभी नौकरियां प्राप्त करें मैंने सर्वर पर अपना AdoJobStore सेटअप किया है और मेरी सभी नौकरियां पूरी तरह से चल रही हैं। अब मैं अपनी सभी नौकरियों का प्रबंधन करने के लिए एक दूरस्थ ग्राहक लिख रहा हूं।Quartz.NET 2.0

नई नौकरियों को निर्धारित करना काफी सरल है, लेकिन मैं संस्करण 2.0 में मौजूदा नौकरियों की एक सूची पुनर्प्राप्त नहीं कर सकता। मैंने पाया सभी संसाधनों में कुछ ऐसा किया गया था।

var groups = sched.JobGroupNames; 
for (int i = 0; i < groups.Length; i++) 
{ 
    string[] names = sched.GetJobNames(groups[i]); 
    for (int j = 0; j < names.Length; j++) 
    { 
     var currentJob = sched.GetJobDetail(names[j], groups[i]); 
    } 
} 

समस्या का सामना करना पड़ रहा हूँ कि GetJobNames निकाल दिया गया है, और स्रोत कोड देख, आधार वर्ग JobStoreSupport, जो JobStoreCMS से विरासत ले जाया गया है। हालांकि विधि को संरक्षित के रूप में चिह्नित किया गया है, इसलिए यह बाहर से पहुंच योग्य नहीं है।

2.0 में नौकरी सूची पुनर्प्राप्त करने के बारे में कोई कैसे जाएगा?

+0

अरे क्या आपके पास संपादन कार्यक्रमों पर कोई उदाहरण है? मैं इसके लिए नया हूं और एक दुःस्वप्न कर रहा हूँ! कृपया –

उत्तर

38

आप का उपयोग को क्रियान्वित कार्यों की सूची लाने कर सकते हैं:

var executingJobs = sched.GetCurrentlyExecutingJobs(); 
foreach (var job in executingJobs) 
{ 
    // Console.WriteLine(job.JobDetail.Key); 
} 

या अनुसूचित नौकरियों के बारे में सभी जानकारी (नमूना सांत्वना आवेदन) लाने:

private static void GetAllJobs(IScheduler scheduler) 
{ 
    IList<string> jobGroups = scheduler.GetJobGroupNames(); 
    // IList<string> triggerGroups = scheduler.GetTriggerGroupNames(); 

    foreach (string group in jobGroups) 
    { 
     var groupMatcher = GroupMatcher<JobKey>.GroupContains(group); 
     var jobKeys = scheduler.GetJobKeys(groupMatcher); 
     foreach (var jobKey in jobKeys) 
     { 
      var detail = scheduler.GetJobDetail(jobKey); 
      var triggers = scheduler.GetTriggersOfJob(jobKey); 
      foreach (ITrigger trigger in triggers) 
      { 
       Console.WriteLine(group); 
       Console.WriteLine(jobKey.Name); 
       Console.WriteLine(detail.Description); 
       Console.WriteLine(trigger.Key.Name); 
       Console.WriteLine(trigger.Key.Group); 
       Console.WriteLine(trigger.GetType().Name); 
       Console.WriteLine(scheduler.GetTriggerState(trigger.Key)); 
       DateTimeOffset? nextFireTime = trigger.GetNextFireTimeUtc(); 
       if (nextFireTime.HasValue) 
       { 
        Console.WriteLine(nextFireTime.Value.LocalDateTime.ToString()); 
       } 

       DateTimeOffset? previousFireTime = trigger.GetPreviousFireTimeUtc(); 
       if (previousFireTime.HasValue) 
       { 
        Console.WriteLine(previousFireTime.Value.LocalDateTime.ToString()); 
       } 
      } 
     } 
    } 
} 

मैं कोड पाया का उपयोग किया है here

अद्यतन:

अगर किसी एक नमूना कोड मेरी GitHub repository से डाउनलोड किया जा सकता रुचि रखता है।

किसी ने पूछा कि नौकरी की सूची कैसे प्राप्त की जाए।
मुझे नहीं लगता कि इसके लिए एक आसान तरीका है।
एकमात्र विकल्प जो दिमाग में आता है वह नौकरी (या ट्रिगर) श्रोता का उपयोग कर रहा है।

मैंने जिथब पर sample अपलोड किया है जहां मेरा मुख्य कार्यक्रम पूर्ण नौकरियों की घटनाएं प्राप्त कर सकता है।

+0

धन्यवाद मदद करें! एक जादू की तरह काम करता है। –

+1

कोड का दूसरा ब्लॉक वही था जो मैं ढूंढ रहा था। धन्यवाद! –

+0

उस उदाहरण में, "शेड्यूल" क्या है और यह कहां से आता है? – wexman

4

आप दोहराएँ अंतराल प्राप्त करना चाहते हैं, गणना दोहराएँ आदि ISimpleTrigger

private void LogInfo(IScheduler scheduler) 
{ 
    log.Info(string.Format("\n\n{0}\n", Scheduler.GetMetaData().GetSummary())); 

    var jobGroups = scheduler.GetJobGroupNames(); 
    var builder = new StringBuilder().AppendLine().AppendLine(); 

    foreach (var group in jobGroups) 
    { 
     var groupMatcher = GroupMatcher<JobKey>.GroupContains(group); 
     var jobKeys = scheduler.GetJobKeys(groupMatcher); 

     foreach (var jobKey in jobKeys) 
     { 
      var detail = scheduler.GetJobDetail(jobKey); 
      var triggers = scheduler.GetTriggersOfJob(jobKey); 

      foreach (ITrigger trigger in triggers) 
      { 
       builder.AppendLine(string.Format("Job: {0}", jobKey.Name)); 
       builder.AppendLine(string.Format("Description: {0}", detail.Description)); 
       var nextFireTime = trigger.GetNextFireTimeUtc(); 
       if (nextFireTime.HasValue) 
       { 
        builder.AppendLine(string.Format("Next fires: {0}", nextFireTime.Value.LocalDateTime)); 
       } 
       var previousFireTime = trigger.GetPreviousFireTimeUtc(); 
       if (previousFireTime.HasValue) 
       { 
        builder.AppendLine(string.Format("Previously fired: {0}", previousFireTime.Value.LocalDateTime)); 
       } 
       var simpleTrigger = trigger as ISimpleTrigger; 
       if (simpleTrigger != null) 
       { 
        builder.AppendLine(string.Format("Repeat Interval: {0}", simpleTrigger.RepeatInterval)); 
       } 
       builder.AppendLine(); 
      } 
     } 
    } 

    builder.AppendLine().AppendLine(); 
    log.Info(builder.ToString); 
} 
2

को ITrigger डाली Quartz.NET संस्करण के बाद से 2.2.1 आप GroupMatcher<>.AnyGroup() का उपयोग कर सकते हैं, यहाँ के लिए एक विस्तार पद्धति के रूप में लागू किया IScheduler:

public static List<IJobDetail> GetJobs(this IScheduler scheduler) 
{ 
    List<IJobDetail> jobs = new List<IJobDetail>(); 

    foreach (JobKey jobKey in scheduler.GetJobKeys(GroupMatcher<JobKey>.AnyGroup())) 
    { 
     jobs.Add(scheduler.GetJobDetail(jobKey)); 
    } 

    return jobs; 
} 

यह आपको हर अनुसूचित नौकरी के लिए IJobDetail रों की एक सूची मिल जाएगा।