Java 石英cron触发器问题春季开机,随机不点火
我对使用spring boot的石英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
@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上正确更新,但正如我随机说的,它不会触发。我在这里找到了密码。有人有同样的问题,可以帮忙吗