19

サーバーに AdoJobStore をセットアップしましたが、すべてのジョブが完全に実行されています。現在、すべてのジョブを管理するリモート クライアントを作成しています。

新しいジョブのスケジューリングは簡単ですが、バージョン 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 で求人リストを取得するにはどうすればよいでしょうか?

4

4 に答える 4

47

実行中のジョブのリストをフェッチするために使用できます。

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

ここにあるコードを使用しました。

更新

誰かが興味を持っている場合は、サンプルコードを私のGitHubリポジトリからダウンロードできます。

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

メインプログラムが完了したジョブのイベントを受信できる サンプルをgithubにアップロードしました。

于 2012-09-19T09:47:50.717 に答える
7

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これにより、スケジュールされたすべてのジョブの のリストが取得されます。

于 2015-07-26T00:08:01.960 に答える
4

繰り返し間隔、繰り返し回数などを取得する場合は、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); 
}
于 2014-04-10T20:55:58.803 に答える