1

プロジェクトでタスクをスケジュールするために Quartz.net を実装しました。いくつかのテストの後、私はそれを Prod env にデプロイしましたが、非常に奇妙な動作を始めました。このスケジューラーは Windows サービスのユーザーであるため、デバッグにはログを使用しました。すべてのジョブは、log4net を介してログ ファイルに情報を書き込みます。3 ~ 4 日の作業の後、サービスはログ ファイルへの情報の書き込みを停止します。すべてのエラーは、ログ ファイルにも書き込まれるように求められますが、何もありません。手動で再起動すると、すべてが 3 ~ 4 日間の予定どおりに開始され、その後再び発生します。

スケジューラーの開始方法は次のとおりです。

_jobsTimeTable = ComponentFactory.Resolve<TimeTable>();

// construct a scheduler factory
ISchedulerFactory schedFact = new StdSchedulerFactory();
// get a scheduler
IScheduler sched = schedFact.GetScheduler();

// Configuration of triggers and jobs
int i = 0;
string mainGroup = "mainGroup";
foreach (var job in _jobsTimeTable.TimeTable)
{
    var trigger = (ICronTrigger)TriggerBuilder.Create()
                                          .WithIdentity("trigger" + i, mainGroup)
                                          .WithCronSchedule(job.Value)
                                          .Build();

    var jobDetail = JobBuilder.Create(Type.GetType(job.Key)).StoreDurably(true)
                                .WithIdentity("job" + i, mainGroup).Build();

    var ft = sched.ScheduleJob(jobDetail, trigger);

    _log.InfoFormat("{0} has been scheduled to run at: {1} and repeat based on expression: {2}",
                    jobDetail.Key, ft.ToLocalTime(), trigger.CronExpressionString);

    i++;
}

sched.Start();

アイデアをいただければ幸いです。

4

1 に答える 1

2

あなたのコードからは、最終的にガベージ コレクションにつながる IScheduler へのグローバル参照を保持していないように見えます。クリーンアップを防ぐために、アプリケーションの存続期間中は常に静的参照を保持する必要があります。

于 2012-06-18T18:23:47.467 に答える