Spring Boot和Quartz-作业未立即执行

时间:2019-01-14 07:27:17

标签: java spring-boot quartz-scheduler jobs

我正在使用Spring Boot配置Quartz作业。要求是立即执行作业,而无需附加任何时间表。

这是我的代码的样子

JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();

String jobName = jobName(taskContext);

factoryBean.setJobClass(MyJobClass.class);
factoryBean.setDurability(true);
factoryBean.setApplicationContext(applicationContext);
factoryBean.setName("Hello job");
factoryBean.setGroup("Hello job group");

JobDataMap jobData = new JobDataMap(new HashMap<>());
factoryBean.setJobDataMap(jobData);
factoryBean.afterPropertiesSet();

JobDetail job = factoryBean.getObject();
Scheduler scheduler = schedulerFactoryBean.getScheduler();
scheduler.addJob(job, replace);
scheduler.triggerJob(job.getKey());

这是quartz.properties的外观

org.quartz.scheduler.instanceName=springBootQuartzApp
org.quartz.scheduler.instanceId=AUTO
org.quartz.threadPool.threadCount=10
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.useProperties=true
org.quartz.jobStore.misfireThreshold=2000
org.quartz.jobStore.tablePrefix=qrtz_
org.quartz.jobStore.isClustered=false
org.quartz.plugin.shutdownHook.class=org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownHook.cleanShutdown=TRUE

问题在于该作业没有立即触发,而是作为断火指令被拾取。正是在misfireThreshold之后立即执行。

如果我错过了配置中的某些内容或未调用任何适当的API,请告诉我。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。

如果您的石英正在使用带有事务的数据源:@EnableTransactionManagement。 请在代码的方法中添加@Transactional,然后立即提交事务。 稍后,调度程序线程再次查找该数据库,并最终将其触发。