1

Quartz.netスケジューラーを機能させようとしていますが、将来スケジュールされているジョブに対してなぜそれが起動しないのかわかりません。私は毎分起動するcronトリガーでテストしましたが、それは(ジョブとすべてで)機能するので、ジョブコードに問題がないことはわかっています。

私が試したこと:

  1. ISchedulerFactoryをグローバル静的変数にする
  2. ISchedulerをグローバル静的変数にする
  3. Application_Startの最後に電子メール通知を追加したので、いつ起動するかがわかります
  4. スケジューラコードを変更するたびにアプリを再起動すると通知メールが送信されるので、再起動されたことがわかります。

私はこのプログラムを共有ホスティング環境で実行しています(それがそれに影響を与えるかどうかはわかりません)。私の推測(そしてこれは単なる推測です)は何かがガベージコレクションされているということですが、何がなぜかはわかりません。

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup
    // construct a scheduler factory
    ISchedulerFactory schedFact = new StdSchedulerFactory();

    // get a scheduler
    IScheduler sched = schedFact.GetScheduler();
    sched.Start();

    // construct job info
    JobDetail jobDetail = new JobDetail("myJob", null, typeof(Recorder));
    jobDetail.JobDataMap["domain"] = "www.mydomain.com";
    jobDetail.JobDataMap["userId"] = "2";

    // Create trigger (everything is in UTC!!!)
    CronTrigger cronTrigger = new CronTrigger("Schedule");
    cronTrigger.StartTimeUtc = TriggerUtils.GetEvenSecondDate(DateTime.UtcNow);
    cronTrigger.TimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");  // run in pacific timezone
    cronTrigger.CronExpressionString = "0 30 13 ? * MON-FRI *"; 

    sched.ScheduleJob(jobDetail, cronTrigger);
}
4

1 に答える 1

2

リクエストが来ない場合、ASP.NET プロセスは IIS によってシャットダウンされる可能性があるため、このコードは実行されません。

これが、Web アプリがサービスのような (常に実行されている) 動作の良いソースではない理由です。

cURLこれが、外部からツールを介してpingされるページ/Webサービスを備えたWebアプリに実装されているのを見てきました。

これをさらにデバッグすることに興味がある場合はApplication_End、タイマーがスケジュールされたジョブを起動する前にプロセスが実際にシャットダウンされることを確認するためだけに、いくつかの通知を追加してください。

于 2012-02-09T17:11:24.310 に答える