2012-09-19 11 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が削除されたことで、ソースコードを見て、JobStoreCMSから継承する基本クラスJobStoreSupportに移動されました。ただし、このメソッドは保護されているとマークされているため、外部からはアクセスできません。

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

UPDATE:誰かが興味を持っている場合は、サンプルコードは、私のGitHub repositoryから

ダウンロードすることができます。

誰かが完了した仕事のリストを取得する方法を尋ねました。
私はそれのための簡単な方法はないと思います。
唯一のオプションは、ジョブ(またはトリガー)リスナーを使用することです。

メインプログラムが完了したジョブのイベントを受信できるgithubにsampleをアップロードしました。 Quartz.NET版はこちらへ拡張メソッドとして実装され、あなたがGroupMatcher<>.AnyGroup()を利用することができます2.2.1以来

+0

ありがとう!魅力のように動作します。 –

+1

2番目のコードブロックは、まさに私が探していたものでした。ありがとう! –

+0

その例では、「sched」とは何ですか?そしてそれはどこから来ますか? – 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をキャスト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のリストを取得します。

関連する問題