石英cron触发器发出弹簧启动,随机不发

问题描述

我使用弹簧靴的石英cron触发器有问题。触发器不随机触发。在我的代码下面。

QuartConfigClass

@Configuration
public class QuartzConfig {
   
   private static final Logger log = LoggerFactory.getLogger(QuartzConfig.class);

   private ApplicationContext applicationContext;
   private DataSource dataSource;

   public QuartzConfig(ApplicationContext applicationContext,DataSource dataSource) {
       this.applicationContext = applicationContext;
       this.dataSource = dataSource;
   }

   @Bean
   public SpringBeanJobFactory springBeanJobFactory() {
       AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
       jobFactory.setApplicationContext(applicationContext);
       return jobFactory;
   }

   @Bean
   public Schedulerfactorybean scheduler(Trigger... triggers) {
       Schedulerfactorybean schedulerFactory = new Schedulerfactorybean();
       Properties properties = new Properties();
       properties.setProperty("org.quartz.scheduler.instanceName","Scheduler");
       properties.setProperty("org.quartz.scheduler.instanceId","Scheduler1");
       properties.setProperty("org.quartz.threadPool.class","org.quartz.simpl.SimpleThreadPool");
       properties.setProperty("org.quartz.threadPool.threadCount","99");
       schedulerFactory.setoverwriteExistingJobs(true);
       schedulerFactory.setAutoStartup(true);
       schedulerFactory.setQuartzProperties(properties);
       schedulerFactory.setDataSource(dataSource);
       schedulerFactory.setJobFactory(springBeanJobFactory());
       schedulerFactory.setWaitForJobsToCompleteOnShutdown(true);
       if (ArrayUtils.isNotEmpty(triggers)) {
           schedulerFactory.setTriggers(triggers);
       }
       return schedulerFactory;
   }

   static SimpleTriggerfactorybean createTrigger(JobDetail jobDetail,long pollFrequencyMs,String triggerName) {
       log.debug("createTrigger(jobDetail={},pollFrequencyMs={},triggerName={})",jobDetail.toString(),pollFrequencyMs,triggerName);
       SimpleTriggerfactorybean factorybean = new SimpleTriggerfactorybean();
       factorybean.setJobDetail(jobDetail);
       factorybean.setStartDelay(0L);
       factorybean.setRepeatInterval(pollFrequencyMs);
       factorybean.setName(triggerName);
       factorybean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
       factorybean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT);
       return factorybean;
   }

   static crontriggerfactorybean createcrontrigger(JobDetail jobDetail,String cronExpression,String triggerName) {
       log.debug("createcrontrigger(jobDetail={},cronExpression={},cronExpression,triggerName);
       // To fix an issue with time-based cron jobs
       Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("CEST"));
       calendar.set(Calendar.SECOND,0);
       calendar.set(Calendar.MILLISECOND,0);
       crontriggerfactorybean factorybean = new crontriggerfactorybean();
       factorybean.setJobDetail(jobDetail);
       factorybean.setCronExpression(cronExpression);
       factorybean.setTimeZone(TimeZone.getTimeZone("CEST"));
       factorybean.setStartTime(calendar.getTime());
       factorybean.setStartDelay(0L);
       factorybean.setName(triggerName);
       factorybean.setMisfireInstruction(crontrigger.MISFIRE_INSTRUCTION_DO_nothing);
       return factorybean;
   }

   static JobDetailfactorybean createJobDetail(Class jobClass,String jobName,Systems system) {
       log.debug("createJobDetail(jobClass={},jobName={})",jobClass.getName(),jobName);
       JobDetailfactorybean factorybean = new JobDetailfactorybean();
       JobDataMap jobDataMap = new JobDataMap();
       factorybean.setName(jobName);
       factorybean.setRequestsRecovery(true);
       factorybean.setJobClass(jobClass);
       factorybean.setDurability(true);
       factorybean.afterPropertiesSet();
       jobDataMap.put("system",system.getId());
       factorybean.setJobDataMap(jobDataMap);
       return factorybean;
   }
   
   static JobDetailfactorybean createJobDetailRegion(Class jobClass,GeographicArea area) {
       log.debug("createJobDetail(jobClass={},jobName);
       JobDetailfactorybean factorybean = new JobDetailfactorybean();
       JobDataMap jobDataMap = new JobDataMap();
       factorybean.setName(jobName);
       factorybean.setJobClass(jobClass);
       factorybean.setDurability(true);
       factorybean.afterPropertiesSet();
       jobDataMap.put("area",area.getId());
       factorybean.setJobDataMap(jobDataMap);
       return factorybean;
   }

}

在哪里定义触发器和作业

@Configuration
public class QuartzSubmitJobs {

   private static final String CRON_INGESTION_AFS1 = "0 30 13 * * ?";

   private static final String CRON_INGESTION_FMS1 = "0 45 13 * * ?";

   private static final String CRON_EMEA = "0 52 15 * * ?";

   private static final String CRON_NA = "0 03 16 * * ?";
   
   private static final String CRON_LATAM = "0 02 17 * * ?";
   
   private static final String CRON_APAC = "0 07 14 * * ?";

   @Bean(name = "ingestionJobAFS1")
   public JobDetailfactorybean jobIngestionAFS1() {
       return QuartzConfig.createJobDetail(IngestionJob.class,"Ingestion afs1 Job",Systems.AFS1);
   }

   @Bean(name = "ingestionJobAFS1Trigger")
   public crontriggerfactorybean triggerIngestionAFS1(@Qualifier("ingestionJobAFS1") JobDetail jobDetail) {
       return QuartzConfig.createcrontrigger(jobDetail,CRON_INGESTION_AFS1,"Ingestion afs1 Trigger");
   }

   @Bean(name = "ingestionJobFMS1")
   public JobDetailfactorybean jobIngestionFMS1() {
       return QuartzConfig.createJobDetail(IngestionJob.class,"Ingestion fms1 Job",Systems.FMS1);
   }

   @Bean(name = "ingestionJobFMS1Trigger")
   public crontriggerfactorybean triggerIngestionFMS1(@Qualifier("ingestionJobFMS1") JobDetail jobDetail) {
       return QuartzConfig.createcrontrigger(jobDetail,CRON_INGESTION_FMS1,"Ingestion fms1 Trigger");
   }

   @Bean(name = "emeaJob")
   public JobDetailfactorybean emeaJob() {
       return QuartzConfig.createJobDetailRegion(TransformationJob.class,"Emea transformation Job",GeographicArea.EMEA);
   }

   @Bean(name = "emeaJobTrigger")
   public crontriggerfactorybean triggerEmea(@Qualifier("emeaJob") JobDetail jobDetail) {
       return QuartzConfig.createcrontrigger(jobDetail,CRON_EMEA,"Emea Trigger");
   }

   @Bean(name = "naJob")
   public JobDetailfactorybean naJob() {
       return QuartzConfig.createJobDetailRegion(TransformationJob.class,"NA transformation Job",GeographicArea.NA);
   }

   @Bean(name = "naJobTrigger")
   public crontriggerfactorybean triggerNaJob(@Qualifier("naJob") JobDetail jobDetail) {
       return QuartzConfig.createcrontrigger(jobDetail,CRON_NA,"naJob Trigger");
   }

   @Bean(name = "apacJob")
   public JobDetailfactorybean apacJob() {
       return QuartzConfig.createJobDetailRegion(TransformationJob.class,"APAC transformation Job",GeographicArea.APAC);
   }

   @Bean(name = "apacJobTrigger")
   public crontriggerfactorybean triggerApacJob(@Qualifier("apacJob") JobDetail jobDetail) {
       return QuartzConfig.createcrontrigger(jobDetail,CRON_APAC,"apacJob Trigger");
   }

   @Bean(name = "latamJob")
   public JobDetailfactorybean latamJob() {
       return QuartzConfig.createJobDetailRegion(TransformationJob.class,"LATAM transformation Job",GeographicArea.LATAM);
   }

   @Bean(name = "latamJobTrigger")
   public crontriggerfactorybean triggerLatamJob(@Qualifier("latamJob") JobDetail jobDetail) {
       return QuartzConfig.createcrontrigger(jobDetail,CRON_LATAM,"latamJob Trigger");
   }

即使经过时间,也不会发现任何未触发的触发器,如图所示。

Spring boot log

数据库表中,触发器状态始终处于等待状态,我认为是正确的。而且,当我更新表达式时,它们也会在db上正确更新,但是就像我随机说的那样,它不会触发。我在https://dzone.com/articles/adding-quartz-to-spring-boot处找到了代码。有人遇到同样的问题并且可以提供帮助吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)