3

Quartz.Net をダウンロードし、古いドキュメントを読んで、正しいと思われる以下のコードに行き着きました。(違っていたら教えてください)

これを ASP.Net アプリケーションの Application_Start に配置すると、コードは実行されますが、ジョブは実行されません。Quartz をシングルトンとして設定することについてどこかで読んだと思いますが、ここでそれを行ったかどうかわかりませんか?

これを毎日 9.00 に実行するように設定したいのですが、今のところ StartNow を使用して動作を確認しています。

私がしなければならないことを教えてください。

    private void StartScheduler()
    {
        ISchedulerFactory schedulerFactory = new StdSchedulerFactory();

        IScheduler scheduler = schedulerFactory.GetScheduler();
        scheduler.Start();

        IJobDetail jobDetail = JobBuilder
            .Create()
            .OfType(typeof(DBCleanUpJob))
            .WithIdentity(new JobKey("test", "1"))
            .Build();

        var trigger = Quartz.TriggerBuilder.Create()
                    .ForJob(jobDetail)
                     .WithIdentity(new TriggerKey("test", "1"))
                    .WithSimpleSchedule()
                    .StartNow()
                    .Build();
        //.WithDailyTimeIntervalSchedule(x=>x.StartingDailyAt(new TimeOfDay(09,00)));



        scheduler.ScheduleJob(jobDetail, trigger);
    }

public class DBCleanUpJob : IJob
{
    private IDocumentSession DocumentSession;

    public DBCleanUpJob(IDocumentSession DocSession)
    {
        DocumentSession = DocSession;
    }

    #region IJob Members

    public void Execute(IJobExecutionContext context)
    {
        throw new NotImplementedException();
    }

    #endregion
}
4

1 に答える 1

7

あなたが言ったように、スケジューラーはシングルトンでなければなりません。スケジューラーに関するコードはシングルトンではなく、スケジューラーは実行中のアプリケーションではなく、開始するアプリケーションのスコープ内にのみ存在します。

public static IScheduler Scheduler { get; private set; }

private void StartScheduler()
{
    Scheduler = new StdSchedulerFactory().GetScheduler();
    Scheduler.Start();

    var jobDetail = JobBuilder
        .Create()
        .OfType(typeof(DBCleanUpJob))
        .WithIdentity(new JobKey("test", "1"))
        .Build();

    var trigger = Quartz.TriggerBuilder.Create()
                .ForJob(jobDetail)
                .WithIdentity(new TriggerKey("test", "1"))
                .WithSimpleSchedule()
                .StartNow()
                .Build();
    //.WithDailyTimeIntervalSchedule(x=>x.StartingDailyAt(new TimeOfDay(09,00)));

    Scheduler.ScheduleJob(jobDetail, trigger);
}

そして、ジェホフが指摘したように。IISは、一定期間アクティビティがない場合、Webサイト/アプリケーションをシャットダウンします。

また、ジョブはasp.netパイプラインにアクセスできないことに注意してください。ジョブはリクエストのコンテキスト内で実行されないため、セッション、リクエスト、レスポンス、Cookieはジョブで利用できません。

最後に、スケジューラーを常に実行する場合は、Webサイトから独立している必要があります。Windowsサービスは良い候補です。Windowsサービスプロジェクトを作成し、サービスの開始時にスケジューラーを開始します。次に、Webサイトでクォーツをセットアップして、Windowsサービスにジョブをプロキシすることができます。サイトがジョブをスケジュールできるようにしますが、実際のストレージと実行はWindowsサービススケジューラによって実行されます。

于 2012-06-14T12:13:22.560 に答える