.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表达式详解

Quartz.net 3.x使用总结——Db持久化和集群

quartz.net StartNow()没用, 不会马上调度一次。 starAt()方法也没有用,求解啊。

Quartz.net 3.x使用总结——Db持久化和集群

Quartz.Net

Quartz.Net学习笔记-简介