5

Quartz.comのドキュメントとグーグルを数時間試しましたが、次のジョブ(将来的に起動する可能性があります)を取得する方法についての良い記事は1つも見つかりませんでした。

VB.net(winforms)を使用して、CronTrigger式を使用してジョブをスケジュールしています。仕事はうまくいきます...しかし、私はユーザーにそれが次にいつ発火するかを見てもらいたいです。CronExpressionをデータベースに保存していますが、その式を使用して次の発火日時をエンドユーザーに表示できますか?または、他に可能な方法がある場合は、アドバイスしてください(簡単なサンプルを使用して)。

ありがとう

編集

次のコードリターン次のジョブは、20分ではなく12分後に起動します

    Dim exp As CronExpression = New CronExpression("0 0/20 * * * ?")
    Dim nextFire As String = exp.GetNextValidTimeAfter(DateTime.Now)
    MsgBox(nextFire)
4

3 に答える 3

6

新しいJobKeyを作成できます

JobKey jobKey = new JobKey(jobName, groupName);

キーを使用してジョブの詳細を取得します。

var detail = scheduler.GetJobDetail(jobKey);

これはあなたが探していることをする単純な関数です:

    private DateTime getNextFireTimeForJob(IScheduler scheduler, string jobName, string groupName = "")
    {
        JobKey jobKey = new JobKey(jobName, groupName);
        DateTime nextFireTime = DateTime.MinValue;

        bool isJobExisting = Scheduler.CheckExists(jobKey);
        if (isJobExisting)
        {
            var detail = scheduler.GetJobDetail(jobKey);
            var triggers = scheduler.GetTriggersOfJob(jobKey);

            if (triggers.Count > 0)
            {
                var nextFireTimeUtc = triggers[0].GetNextFireTimeUtc();
                nextFireTime = TimeZone.CurrentTimeZone.ToLocalTime(nextFireTimeUtc.Value.DateTime);
            }
        }

        return (nextFireTime);
    }

ジョブごとにトリガーが1つある場合にのみ機能します。
ジョブに複数のトリガーがある場合は、それらをループできます。

foreach (ITrigger trigger in triggers)
{
    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(TimeZone.CurrentTimeZone.ToLocalTime(nextFireTime.Value.DateTime).ToString());
    }
}

またはLinq(System.Linq)を使用する:

 var myTrigger = triggers.Where(f => f.Key.Name == "[trigger name]").SingleOrDefault();
于 2012-11-30T10:46:47.653 に答える
4

すでにcronExpressionを知っている場合は、GetNextValidTimeAfterを呼び出すことができます。

CronExpression exp = new CronExpression("0 0 0/1 1/1 * ? *");
var nextFire = exp.GetNextValidTimeAfter(DateTime.Now);
Console.WriteLine(nextFire);

より多くの発砲時間が必要な場合は、

for(int i=0 ; i< 9; i++)
{
    if (nextFire.HasValue)
    {
        nextFire = exp.GetNextValidTimeAfter(nextFire.Value);        
        Console.WriteLine(nextFire);
     }
}

既存のジョブの次の起動時間を表示するより一般的な方法を探している場合は、cron式を使用していない場合でも機能するこの質問への回答を確認してください。これはQuartzバージョン2用です

Quartzバージョン1のジョブおよびトリガー情報を取得する方法は、以下の方法のようなものです。

 public void GetListOfJobs(IScheduler scheduler)
 {
    var query =
        (from groupName in scheduler.JobGroupNames
         from jobName in scheduler.GetJobNames(groupName)
         let triggers = scheduler.GetTriggersOfJob(jobName, groupName)
         select new 
            { 
                groupName, 
                jobName, 
                triggerInfo = (from trigger in triggers select trigger) 
            }
        );

   foreach (var r in query)
   {
       if (r.triggerInfo.Count() == 0)
       {
           var details = String.Format("No triggers found for : Group {0}  Job {1}", r.groupName, r.jobName);
           Console.WriteLine(details);                   
       }

       foreach (var t in r.triggerInfo)
       {
           var details = String.Format("{0,-50} {9} Next Due {1,30:r} Last Run {2,30:r}  Group {3,-30}, Trigger {4,-50} {5,-50} Scheduled from {6:r} Until {7,30:r} {8,30:r} ",
               t.JobName,
               t.GetNextFireTimeUtc().ToLocalTime(), 
               t.GetPreviousFireTimeUtc().ToLocalTime(),
               t.JobGroup, 
               t.Name, 
               t.Description,
               t.StartTimeUtc.ToLocalTime(), 
               t.EndTimeUtc.ToLocalTime(), 
               t.FinalFireTimeUtc.ToLocalTime(),
               ((t.GetNextFireTimeUtc() > DateTime.UtcNow) ? "Active  " : "InActive")
               );

           Console.WriteLine(details);

       }
   }

}

于 2012-11-29T22:27:38.617 に答える
0

終了時刻を過ぎた日付でも、次の実行時刻が取得されるという問題がありました。以下は、Quartz3.0.4で最終的に正しい結果を返す私の実装です。

internal static DateTime? GetNextFireTimeForJob(IJobExecutionContext context)
        {
            JobKey jobKey = context.JobDetail.Key;
            DateTime? nextFireTime = null;

            var isJobExisting = MyQuartzScheduler.CheckExists(jobKey);
            if (isJobExisting.Result)
            {
                var triggers = MyQuartzScheduler.GetTriggersOfJob(jobKey);

                if (triggers.Result.Count > 0)
                {
                    var nextFireTimeUtc =  triggers.Result.First().GetNextFireTimeUtc();
                    if (nextFireTimeUtc.HasValue)
                    {
                        nextFireTime = TimeZone.CurrentTimeZone.ToLocalTime(nextFireTimeUtc.Value.DateTime);
                    }
                }
            }

            return nextFireTime;
        }
于 2018-05-02T14:20:26.777 に答える