问题描述
我使用弹簧靴的石英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");
}
在数据库表中,触发器状态始终处于等待状态,我认为是正确的。而且,当我更新表达式时,它们也会在db上正确更新,但是就像我随机说的那样,它不会触发。我在https://dzone.com/articles/adding-quartz-to-spring-boot处找到了代码。有人遇到同样的问题并且可以提供帮助吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)