Quartz.Net em ASP.Net aplicação

acabei de transferir Quartz.Net, leia a documentação que está desactualizada e acabou com o código abaixo que eu acredito estar correto. (Avise - me se não for)

coloquei isto na minha candidatura. ASP.Net a aplicação e o código são executados, mas o trabalho não é executado. Acho que li algures sobre colocar o quartzo como um singleton, mas não sei se o fiz aqui?

quero programar isto para correr diariamente às 9h00, mas por agora usei o StartNow para verificar funciona.

Por favor, diga-me o que tenho de fazer.

    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
}
Author: Jon, 2012-06-14

1 answers

Como disseste, O scheduler deve ser um singleton. com o código sobre scheduler não é um singleton e o scheduler só existe no escopo da aplicação Iniciando, não a aplicação executando.
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);
}

E como Jeof salientou. O IIS encerrará um site/aplicação se não houver atividade por um determinado período de tempo.

Note também que os seus empregos não terão acesso ao asp.net pipeline. os trabalhos não são executados no contexto de um pedido, portanto sessão, pedido, resposta, cookies não estão disponíveis para o trabalho.

Finalmente, se você quer que o scheduler para sempre executar ele terá que ser independente do site. Os Serviços Windows são um bom candidato. crie um projeto de serviço windows e faça com que o scheduler comece quando o serviço começar. você poderia então configurar o quartzo no site para proxy jobs para o serviço windows. permitindo ao site agendar tarefas, mas o armazenamento e execução reais são realizados pelo serviço windows programador.

 6
Author: Jason Meckley, 2012-06-14 12:14:44