.Net Quartz.NET Trigger 触发器使用以及重入问题
Posted シ゛甜虾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.Net Quartz.NET Trigger 触发器使用以及重入问题相关的知识,希望对你有一定的参考价值。
初始化调度器,如果有耗时任务,就会出现函数重入问题,这里通过加标识位来解决此问题
public static void Start()
{
ISchedulerFactory schedulefactory = new StdSchedulerFactory();//实例化调度器工厂
schedulefactory.GetScheduler().ContinueWith(x => {
if (x.IsFaulted)
{
Console.WriteLine(x.Exception);
return;
}
try
{
IScheduler scheduler = x.Result;
scheduler.Start();
if (AppSetting.IsDataIntegrity == true)
{
//创建第二个作业
IJobDetail dataIntegrityJob = JobBuilder.Create<DataIntegrityJob>()//创建一个作业
.WithIdentity("dataIntegrityJob", "DefaultGroup")
.Build();
ITrigger dataIntegrityJobTrigger = TriggerBuilder.Create()//创建一个触发器
.WithIdentity("dataIntegrityJobTrigger", "DefaultGroup")
.StartNow()
.WithSimpleSchedule(b => b.WithIntervalInMinutes(5)//5分钟执行一次
.RepeatForever())//无限循环执行
.Build();
scheduler.ScheduleJob(dataIntegrityJob, dataIntegrityJobTrigger);//把作业,触发器加入调度器
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
});//实例化调度器
}
标志位防止重入
public class DataIntegrityJob : IJob
{
private static readonly object objlock = new object();
private static bool isRun = false;
private static long taskNum = 0;
public async Task Execute(IJobExecutionContext context)
{
try
{
lock (objlock)
{
if (isRun == true)
{
Console.WriteLine("isRun == true 周期任务Job正在运行!");
return;
}
isRun = true;
}
taskNum++;
_logger.Info(typeof(DataIntegrityJob), "结束执行周期任务...第" + taskNum.ToString() + "次!");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
lock (objlock)
{
isRun = false;
}
}
}
以上是关于.Net Quartz.NET Trigger 触发器使用以及重入问题的主要内容,如果未能解决你的问题,请参考以下文章
Quartz.Net系列:Trigger之CronScheduleBuilder和Cron表达式详解