ASP.Net应用程序中的Quartz.Net

时间:2012-06-14 11:46:56

标签: c# .net quartz-scheduler quartz.net quartz.net-2.0

刚刚下载了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
}

1 个答案:

答案 0 :(得分: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将关闭网站/应用程序。

另请注意,您的作业无法访问asp.net管道。作业不在请求的上下文中执行,因此会话,请求,响应,cookie不可用于作业。

最后,如果您希望调度程序始终运行,则需要独立于网站。 Windows服务是一个很好的选择。创建一个Windows服务项目,并在服务启动时启动调度程序。然后,您可以在网站上设置石英以将作业代理到Windows服务。允许站点调度作业,但实际的存储和执行由Windows服务调度程序执行。