Quartz的冲突处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhoucs86/article/details/87522482

说明一下如何处理好quartz的调度关系

首先查看一下quartz的配置,有设置thread factory的方法,具体没有试过。还有thread factory的大小的设置

org.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之前添加注解

@DisallowConcurrentExecution

Misfire

而Task的冲突是用misfire来处理的。misfire一共可能是由三种可能性引起的:

  • 不允许并发的任务冲突
  • 任务抛出Exception
  • scheduler停止

鉴于第三种情况在我们的场景当中比较少见,着重分析一下前两种情况:

https://www.cnblogs.com/skyLogin/p/6927629.html

根据上文的说明,在配置Schedule的时候有三种策略,配置两种场景来说:

如果发生冲突的时候丢弃后一次task

@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。 如果冲突时间在这个范围以内不会被判为冲突,依然会执行

2019-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策略设为这个模式

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()));

    }

2019-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的启动,会立即尝试重试

猜你喜欢

转载自blog.csdn.net/zhoucs86/article/details/87522482