在.net中配置quartz.net调度程序

时间:2019-05-21 12:40:06

标签: c# .net quartz.net

我在.Net framework中有一个应用程序,并且我在使用石英调度程序。我需要配置石英。 现在,我有一种方法,每15分钟触发一次。这些方法用于处理数据库。我希望,如果程序的工作完成了,然后开始等待期,然后在这段时间之后再次启动这些数据库方法。 对于该程序,将有最大时间,该时间不能更长。例如60分钟。您是否有任何想法如何配置工作流程的长度,如何在工作完成后停止以及如何定义之间的等待时间?

1 个答案:

答案 0 :(得分:0)

// 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
    }
}