サーバーに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でジョブリストを取得するにはどうすればよいですか?
実行中のジョブのリストのフェッチを使用できます。
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に sample をアップロードしました。
繰り返し間隔、繰り返し回数などを取得する場合は、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);
}
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
sのリストが表示されます。