Java 石英cron触发器问题春季开机,随机不点火

Java 石英cron触发器问题春季开机,随机不点火,java,spring-boot,quartz-scheduler,quartz,crontrigger,Java,Spring Boot,Quartz Scheduler,Quartz,Crontrigger,我对使用spring boot的石英cron触发器有一些问题。随机触发不会触发。在我的代码下面 四次配置类 @Configuration public class QuartzConfig { private static final Logger log = LoggerFactory.getLogger(QuartzConfig.class); private ApplicationContext applicationContext; private DataS

我对使用spring boot的石英cron触发器有一些问题。随机触发不会触发。在我的代码下面

四次配置类

@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={}, triggerName={})", jobDetail.toString(),
               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, String jobName, GeographicArea area) {
       log.debug("createJobDetail(jobClass={}, jobName={})", jobClass.getName(), 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");
   }

即使时间过去了,也没有发现任何如图所示的缺火触发器。

在db表中,触发器状态总是在等待,我认为这是正确的。此外,当我更新表达式时,它们也会在db上正确更新,但正如我随机说的,它不会触发。我在这里找到了密码。有人有同样的问题,可以帮忙吗