0

Quartzは初めてで、SQLServerExpressを使用するクライアント向けのサービスを使用してSQLServerでスクリプトをスケジュールするために使用したいと考えています。

ユーザーが実行するタスクをスケジュールできるようにする必要があります。たとえば、特定の日付から2週間ごとに実行する必要があります。例:StartDate = 1 / Jan / 2013 12:00 PM(火曜日)そして14日ごとに繰り返します。

ジョブの設定には、StartTime(日時)、IntervalUnit(秒、分、時間、日、週、年)、およびRepeatsEvery(開始日以降に起動する間隔の数)があります。

例:StartDate = "1 / JAN / 201312:00PM"およびIntervalUnit="DAY"およびRepeatsEvery=14の設定では、第2火曜日の12:00PMにジョブが起動されます。StartDateがすでに過ぎている場合は、次の開始日にジョブを起動する必要があります。例:今日(2013年1月18日)にサービスを開始した場合、次の開始日は2013年1月29日12:00PMになります。

カレンダートリガーを使用して、Quartzでこれを機能させる方法がわかりません。これはQuartzに組み込まれているものですか、それとも起動時に新しいStartTimeを計算する必要がありますか?

新しいStartTimeを計算する必要があると仮定すると、これに組み込まれた関数または適切なショートカットがありますか、それとも各IntervalUnitにこれと同様の関数が必要ですか?

'Days
Dim diff As Integer
diff = Now.Subtract(.StartTime).TotalDays
Dim offset As Integer
offset = .RepeatsEvery - (diff Mod .RepeatsEvery)
offset = Now.AddDays(offset).Subtract(.StartTime).TotalDays 'Get the days from Start t preserve time of day
Start = .StartTime.AddDays(offset)
4

1 に答える 1

1

トリガーを作成してからtrigger.GetFireTimeAfter(DateTime.Now)を呼び出して新しい開始日を計算し、新しいStartDateを使用して新しいトリガーを作成できます。

以下はC#ですが、うまくいけばあなたにアイデアを与えるでしょう

var trigger = TriggerBuilder.Create()
                   .StartAt( new DateTimeOffset(new DateTime(2013,1,1)))
                   .WithSimpleSchedule(x=>x.RepeatForever()
                                          .WithInterval(new TimeSpan(14,0,0,0)))
                    .Build();                


var newStartingPoint = trigger.GetFireTimeAfter(DateTime.Now);

if (newStartingPoint.HasValue)  
{ 
     trigger = ((ISimpleTrigger) trigger).GetTriggerBuilder()
                                        .StartAt(newStartingPoint.Value)
                                        .Build();    
}

.GetTriggerBuilder()はITriggerでは使用できません。そのため、トリガーをISimpleTriggerにキャストする必要がありますが、同じ原則が他のトリガーでも機能します。

于 2013-01-18T10:41:27.000 に答える