Настройка планировщика quartz.net в .net - PullRequest
0 голосов
/ 21 мая 2019

У меня есть приложение в .Net Framework, и я использую кварцевый планировщик. Мне нужно настроить кварц. Теперь у меня есть один метод, который запускается каждые 15 минут. Этот метод используется для работы с базой данных. Я хочу, в случае, если работа процедуры завершена, затем начать период ожидания и после этого периода снова запустить метод базы данных. Для процедуры будет максимальное время, которое не может быть дольше. Например, 60 минут. Есть ли у вас какие-либо идеи, как настроить продолжительность рабочей процедуры, как остановить, когда работа закончена, и как определить время ожидания между?

1 Ответ

0 голосов
/ 25 мая 2019
// configure Quartz
var stdSchedulerProperties = new NameValueCollection
{
    { "quartz.threadPool.threadCount", "10" },
    { "quartz.jobStore.misfireThreshold", "60000" }
};
var stdSchedulerFactory = new StdSchedulerFactory(stdSchedulerProperties);
var scheduler = stdSchedulerFactory.GetScheduler().Result;
scheduler.Start();

// create job and specify timeout
IJobDetail job = JobBuilder.Create<JobWithTimeout>()
    .WithIdentity("job1", "group1")
    .UsingJobData("timeoutInMinutes", 60)
    .Build();

// create trigger and specify repeat interval
ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("trigger1", "group1")
    .StartNow()
    .WithSimpleSchedule(x => x.WithIntervalInMinutes(15).RepeatForever())            
    .Build();

// schedule job 
scheduler.ScheduleJob(job, trigger).Wait();

/// <summary>
///     Implementation of IJob. Represents the wrapper job for a task with timeout
/// </summary>
public class JobWithTimeout : IJob
{
    public Task Execute(IJobExecutionContext context)
    {
        return Task.Run(() => Execute(context));
    }

    public void Execute(IJobExecutionContext context)
    {
        Thread workerThread = new Thread(DoWork);
        workerThread.Start();

        context.JobDetail.JobDataMap.TryGetValue("timeoutInMinutes", out object timeoutInMinutes);
        TimeSpan timeout = TimeSpan.FromMinutes((int)timeoutInMinutes);
        bool finished = workerThread.Join(timeout);
        if (!finished) workerThread.Abort();
    }

    public void DoWork()
    {
        // do stuff
    }
}
...