Quartz 当 Job 执行时间超过触发间隔时间时所发生的情况
来源:互联网 发布:淘宝耳环 编辑:程序博客网 时间:2024/04/27 15:43
一个普通的 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{}
阅读全文
0 0
- Quartz 当 Job 执行时间超过触发间隔时间时所发生的情况
- org.quartz调度JOB执行时间超过调度周期的情况说明
- java定时器Timer当执行时间大于间隔时间会怎样
- [C# 基础知识系列]专题五:当点击按钮时触发Click事件背后发生的事情
- [C# 基础知识系列]专题五:当点击按钮时触发Click事件背后发生的事情
- [C# 基础知识系列]专题五:当点击按钮时触发Click事件背后发生的事情
- C# 基础知识系列]专题五:当点击按钮时触发Click事件背后发生的事情
- quartz 动态JOB时参数的传递(特别是在多租户情况下很重要)
- Quartz入门实例5-处理因执行job超时而错过触发的job
- Oracle JOB常见的执行时间
- oracle JOB常见的执行时间
- oracle JOB常见的执行时间
- oracle JOB常见的执行时间
- Oracle JOB常见的执行时间
- oracle中job的执行时间
- oracle JOB常见的执行时间
- ps cs4安装时发生错误——下载所选选件的大小超过安装位置的可用磁盘空间
- 【Quartz】Quartz将Job保存在数据库中所需表的说明
- Packet for query is too large (1032 > 1024). You can change this value on the server by setting the
- 选了几个中药,医药的,平均仓位
- python--打印两个有序链表的公共部分
- 【CodeCombat-Python】地牢-kithgard 斗殴
- csdn请选择文章类型
- Quartz 当 Job 执行时间超过触发间隔时间时所发生的情况
- mybatis报错Error building SqlSession. ### Cause: org.apache.ibatis.builder.BuilderException: Error cre
- JDK 8.0 新特性——函数式接口和Lambda 表达式
- Part3-非监督学习
- WINDOWS 7 配置驱动开发环境(wdk7.60)
- mysql Access denied for user root@localhost错误解决方法总结
- 使用MMX/SSE汇编指令集优化视频开发
- mysql二进制日志(binlog)
- SQL数据库基础知识复习