说明一下如何处理好quartz的调度关系
首先查看一下quartz的配置,有设置thread factory的方法,具体没有试过。还有thread factory的大小的设置
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14org.quartz.scheduler.jobFactory.class:com.yh.bigdata.silkworm.api.scheduler.JobFactory org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount: 95 org.quartz.threadPool.threadPriority: 5 org.quartz.jobStore.misfireThreshold: 1 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate org.quartz.jobStore.useProperties=false org.quartz.jobStore.dataSource=dev org.quartz.jobStore.tablePrefix=QRTZ_ org.quartz.jobStore.isClustered=true org.quartz.jobStore.clusterCheckinInterval: 1000
而默认来讲同类型Task的触发是允许并发,quartz内部的后一个Task实例并不会管前一个实例有没有运行完成
需要再Task之前添加注解
复制代码
1
2
3@DisallowConcurrentExecution
Misfire
而Task的冲突是用misfire来处理的。misfire一共可能是由三种可能性引起的:
- 不允许并发的任务冲突
- 任务抛出Exception
- scheduler停止
鉴于第三种情况在我们的场景当中比较少见,着重分析一下前两种情况:
https://www.cnblogs.com/skyLogin/p/6927629.html
根据上文的说明,在配置Schedule的时候有三种策略,配置两种场景来说:
如果发生冲突的时候丢弃后一次task
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29@DisallowConcurrentExecution public class DemoTrialJob implements Job { private static Logger LOG = LoggerFactory.getLogger(DemoTrialJob.class); public void execute(JobExecutionContext context) throws JobExecutionException { LOG.info(String.format("%s",context.getTrigger().getMisfireInstruction())); LOG.info(String.format("%s,Plan %s, time %s",Thread.currentThread(), context.getScheduledFireTime() ,java.util.Calendar.getInstance().getTime())); // throw new JobExecutionException(); try{ Thread.sleep(4000L); }catch (InterruptedException e){ e.printStackTrace(); } LOG.info(String.format("End %s,Plan %s , time %s",Thread.currentThread(), context.getScheduledFireTime() ,java.util.Calendar.getInstance().getTime())); } } CronScheduleBuilder csb = CronScheduleBuilder.cronSchedule("*/2 * * * * ?"); MutableTrigger triggerCron = csb.withMisfireHandlingInstructionDoNothing().build(); CronTriggerImpl cronTrigger = (CronTriggerImpl)triggerCron; cronTrigger.setName("cron trigger"); System.err.println(triggerCron.getClass());
quartz会跳过发生冲突的任务不做处理
这里需要注意的是,quartz对于冲突的判定有一个容忍期,见配置文件当中的 org.quartz.jobStore.misfireThreshold。 如果冲突时间在这个范围以内不会被判为冲突,依然会执行
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
132019-01-31 20:27:48.343 INFO 9032 --- [_MisfireHandler] org.quartz.impl.jdbcjobstore.JobStoreTX : Handling 1 trigger(s) that missed their scheduled fire-time. 2019-01-31 20:27:50.411 INFO 9032 --- [eduler_Worker-1] c.y.b.s.a.s.j.demotrialjob.DemoTrialJob : 2 2019-01-31 20:27:50.413 INFO 9032 --- [eduler_Worker-1] c.y.b.s.a.s.j.demotrialjob.DemoTrialJob : Thread[SpringQrtzScheduler_Worker-1,5,main],Plan Thu Jan 31 20:27:50 CST 2019, time Thu Jan 31 20:27:50 CST 2019 2019-01-31 20:27:54.414 INFO 9032 --- [eduler_Worker-1] c.y.b.s.a.s.j.demotrialjob.DemoTrialJob : End Thread[SpringQrtzScheduler_Worker-1,5,main],Plan Thu Jan 31 20:27:50 CST 2019 , time Thu Jan 31 20:27:54 CST 2019 2019-01-31 20:27:54.679 INFO 9032 --- [_MisfireHandler] org.quartz.impl.jdbcjobstore.JobStoreTX : Handling 1 trigger(s) that missed their scheduled fire-time. 2019-01-31 20:27:56.368 INFO 9032 --- [eduler_Worker-2] c.y.b.s.a.s.j.demotrialjob.DemoTrialJob : 2 2019-01-31 20:27:56.374 INFO 9032 --- [eduler_Worker-2] c.y.b.s.a.s.j.demotrialjob.DemoTrialJob : Thread[SpringQrtzScheduler_Worker-2,5,main],Plan Thu Jan 31 20:27:56 CST 2019, time Thu Jan 31 20:27:56 CST 2019 2019-01-31 20:28:00.379 INFO 9032 --- [eduler_Worker-2] c.y.b.s.a.s.j.demotrialjob.DemoTrialJob : End Thread[SpringQrtzScheduler_Worker-2,5,main],Plan Thu Jan 31 20:27:56 CST 2019 , time Thu Jan 31 20:28:00 CST 2019 2019-01-31 20:28:00.671 INFO 9032 --- [_MisfireHandler] org.quartz.impl.jdbcjobstore.JobStoreTX : Handling 1 trigger(s) that missed their scheduled fire-time. 2019-01-31 20:28:02.368 INFO 9032 --- [eduler_Worker-3] c.y.b.s.a.s.j.demotrialjob.DemoTrialJob : 2 2019-01-31 20:28:02.369 INFO 9032 --- [eduler_Worker-3] c.y.b.s.a.s.j.demotrialjob.DemoTrialJob : Thread[SpringQrtzScheduler_Worker-3,5,main],Plan Thu Jan 31 20:28:02 CST 2019, time Thu Jan 31 20:28:02 CST 2019
对于报错的任务立即重试
再来看一个场景,当任务执行失败抛出Exception的时候:
withMisfireHandlingInstructionFireAndProceed 我们把misfire策略设为这个模式
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public void execute(JobExecutionContext context) throws JobExecutionException { LOG.info(String.format("%s",context.getTrigger().getMisfireInstruction())); LOG.info(String.format("%s,Plan %s, time %s",Thread.currentThread(), context.getScheduledFireTime() ,java.util.Calendar.getInstance().getTime())); throw new JobExecutionException(); // try{ // Thread.sleep(4000L); // }catch (InterruptedException e){ // e.printStackTrace(); // } // LOG.info(String.format("End %s,Plan %s , time %s",Thread.currentThread(), // context.getScheduledFireTime() ,java.util.Calendar.getInstance().getTime())); }
复制代码
1
2
3
4
5
6
7
8
9
10
112019-01-31 20:41:40.490 INFO 16796 --- [_MisfireHandler] org.quartz.impl.jdbcjobstore.JobStoreTX : Handling 1 trigger(s) that missed their scheduled fire-time. 2019-01-31 20:41:40.910 INFO 16796 --- [_MisfireHandler] org.quartz.impl.jdbcjobstore.JobStoreTX : Handling 1 trigger(s) that missed their scheduled fire-time. 2019-01-31 20:41:41.333 INFO 16796 --- [_MisfireHandler] org.quartz.impl.jdbcjobstore.JobStoreTX : Handling 1 trigger(s) that missed their scheduled fire-time. 2019-01-31 20:41:41.758 INFO 16796 --- [_MisfireHandler] org.quartz.impl.jdbcjobstore.JobStoreTX : Handling 1 trigger(s) that missed their scheduled fire-time. 2019-01-31 20:41:42.190 INFO 16796 --- [_MisfireHandler] org.quartz.impl.jdbcjobstore.JobStoreTX : Handling 1 trigger(s) that missed their scheduled fire-time. 2019-01-31 20:41:42.609 INFO 16796 --- [_MisfireHandler] org.quartz.impl.jdbcjobstore.JobStoreTX : Handling 1 trigger(s) that missed their scheduled fire-time. 2019-01-31 20:41:43.022 INFO 16796 --- [_MisfireHandler] org.quartz.impl.jdbcjobstore.JobStoreTX : Handling 1 trigger(s) that missed their scheduled fire-time. 2019-01-31 20:41:43.434 INFO 16796 --- [_MisfireHandler] org.quartz.impl.jdbcjobstore.JobStoreTX : Handling 1 trigger(s) that missed their scheduled fire-time. 2019-01-31 20:41:43.855 INFO 16796 --- [_MisfireHandler] org.quartz.impl.jdbcjobstore.JobStoreTX : Handling 1 trigger(s) that missed their scheduled fire-time.
那么,当任务报错的时候,quartz不会等待下一次task的启动,会立即尝试重试
最后
以上就是鲜艳睫毛最近收集整理的关于Quartz的冲突处理的全部内容,更多相关Quartz内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复