2012-09-19 37 views
10

Tôi đã thiết lập AdoJobStore trên máy chủ và tất cả công việc của tôi đang chạy hoàn hảo. Bây giờ tôi đang viết một khách hàng từ xa để quản lý tất cả các công việc của tôi.Nhận tất cả công việc trong Quartz.NET 2.0

Lập lịch công việc mới khá đơn giản, nhưng dường như tôi không thể truy xuất danh sách các công việc hiện có trong phiên bản 2.0. Tất cả các tài nguyên tôi tìm thấy đã làm một cái gì đó như sau.

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]); 
    } 
} 

Vấn đề tôi đang phải đối mặt là GetJobNames đã được gỡ bỏ, và nhìn vào mã nguồn, đã được chuyển đến các JobStoreSupport lớp cơ sở, trong đó JobStoreCMS thừa hưởng từ. Tuy nhiên, phương pháp này đã được đánh dấu là được bảo vệ, vì vậy nó không thể truy cập từ bên ngoài.

Làm cách nào để truy xuất danh sách công việc trong 2.0?

+0

Bạn có bất kỳ ví dụ nào về chỉnh sửa lịch biểu không? Im mới này và có một cơn ác mộng! hãy giúp –

Trả lời

38

Bạn có thể sử dụng lấy một danh sách các công việc thực hiện:

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

hoặc lấy tất cả các thông tin về việc theo lịch trình (mẫu giao diện điều khiển ứng dụng):

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()); 
       } 
      } 
     } 
    } 
} 

Tôi đã sử dụng mã tìm thấy here.

CẬP NHẬT:

Nếu ai đó quan tâm đến một mẫu mã có thể được tải về từ GitHub tôi repository.

Ai đó đã hỏi cách lấy danh sách công việc đã hoàn thành.
Tôi không nghĩ rằng có một cách dễ dàng cho điều đó.
Tùy chọn duy nhất mà bạn nghĩ đến là sử dụng công cụ nghe (hoặc trình kích hoạt).

Tôi đã tải lên sample trên github nơi chương trình chính của tôi có thể nhận sự kiện của công việc đã hoàn thành.

+0

Cảm ơn! Làm việc như một say mê. –

+1

Khối thứ hai của mã là chính xác những gì tôi đang tìm kiếm. Cảm ơn! –

+0

Trong ví dụ đó, "lịch trình" là gì và nó đến từ đâu? – wexman

4

Nếu bạn muốn nhận được Lặp lại Interval, Lặp lại Đếm vv cast ITrigger để 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

Kể từ phiên bản 2.2.1 Quartz.NET bạn có thể tận dụng GroupMatcher<>.AnyGroup(), đây thực hiện như một phương pháp mở rộng 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; 
} 

Điều này sẽ giúp bạn có được một danh sách các IJobDetail s cho mỗi công việc theo lịch trình.

Các vấn đề liên quan