zoukankan      html  css  js  c++  java
  • 小记:Quartz 当 Job 执行时间超过触发间隔时间时所发生的情况

    一个普通的 Job 实现如下:

    public class Job1 : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine(DateTime.Now + ": Job1" + m);
        }
    }
    
    public class Program
    {
        static void Main(string[] args)
        {
            var props = new NameValueCollection();
            //使用简单线程池
            props["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
            //最大线程数
            props["quartz.threadPool.threadCount"] = "10";
            //线程优先级:正常
            props["quartz.threadPool.threadPriority"] = "Normal";
            //初始化调度器
            IScheduler scheduler = new StdSchedulerFactory(props).GetScheduler();
    
            //Cron 触发器,每隔 1 秒触发一次
            ITrigger trig = TriggerBuilder.Create().WithCronSchedule("0/1 * * * * ?").Build();
            //将作业 Job1 加入调度计划中
            scheduler.ScheduleJob(JobBuilder.Create<Job1>().Build(), trig);
            //开始执行
            scheduler.Start();
            
            Console.ReadLine();
            scheduler.Shutdown();
        }
    }

    执行结果如下:可以看到,Job1 准确的每隔 1 秒执行一次

    现在问题来了:如果 Job1 中的操作执行时间很长,超过了间隔时间 1 秒,会发生什么情况?代码如下:

    public class Job1 : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine(DateTime.Now + ": Job1" + m);
            //等待 5 秒
            Thread.Sleep(5000);
        }
    }

    执行结果如下:

    我们会发现,Quartz 仍然会按照我们设定的每隔 1 秒触发一次。

    这是因为默认情况下,当Job执行时间超过间隔时间时,调度框架为了能让任务按照我们预定的时间间隔执行,会马上启用新的线程执行任务

    若我们希望当前任务执行完之后再执行下一轮任务,也就是不要并发执行任务,该如何解决呢?

    第一种方法:设置 quartz.threadPool.threadCount 最大线程数为 1。这样到了第二次执行任务时,若当前还没执行完,调度器想新开一个线程执行任务,但我们却设置了最大线程数为 1 个(即:没有足够的线程提供给调度器),则调度器会等待当前任务执行完之后,再立即调度执行下一次任务。(注意:此方法仅适用于Quartz中仅有一个Job,如果有多个Job,会影响其他Job的执行)

    第二种方法:在 Job 类的头部加上 [DisallowConcurrentExecution],表示禁用并发执行。(推荐使用此方法)

    //不允许此 Job 并发执行任务(禁止新开线程执行)
    [DisallowConcurrentExecution]
    public class Job1 : IJob
    {
    }
  • 相关阅读:
    canvas 画一个钟表
    .net防止写文件线程冲突
    .net中params以前没关注过的一个现象
    dom属性和特性
    数组常用方法
    新手配置vux
    改变placeholder的字体颜色大小
    设置cookie,删除cookie,读取cookie
    css 画三角形
    audio元素和video元素在ios和andriod中无法自动播放
  • 原文地址:https://www.cnblogs.com/wynn0123/p/4646206.html
Copyright © 2011-2022 走看看