博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小记:Quartz 当 Job 执行时间超过触发间隔时间时所发生的情况
阅读量:6691 次
发布时间:2019-06-25

本文共 1767 字,大约阅读时间需要 5 分钟。

一个普通的 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
().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{}

 

转载于:https://www.cnblogs.com/wynn0123/p/4646206.html

你可能感兴趣的文章
每天一个linux命令(50):crontab命令
查看>>
linux命令7--cat命令&nl命令
查看>>
.NET底层开发技术
查看>>
RHEL regiester
查看>>
c/c++中的一些基础知识
查看>>
练习:输出整数每一位,计算算数,9出现次数,输出图案,水仙花数
查看>>
操作系统的发展
查看>>
HEVC码流简单分析
查看>>
搭建蚂蚁笔记(服务器)
查看>>
lnmp
查看>>
二分查找
查看>>
Cloud Test 在手,宕机时让您不再措手不及
查看>>
Centos7.2安装Vmware Tools
查看>>
深入理解Java内存模型(一)——基础
查看>>
美图秀秀下载|美图秀秀电脑版下
查看>>
生产者消费者模式
查看>>
tomcat的Context配置,虚拟访问数据
查看>>
ORACLE---添加控制文件
查看>>
Qt中QString,char,int,QByteArray之间到转换
查看>>
Exchange Server 2007邮箱存储服务器的集群和高可用性技术(上)
查看>>