Spring Boot和Quartz - 任务不立即执行

4
我正在使用Spring Boot配置Quartz job。要求立即执行该作业,而不附加任何计划。
以下是我的代码:
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

问题在于任务不会立即触发,并被视为“misfire instruction”(错过执行机会的指令)。它会在misfireThreshold之后立即执行。
如果我在配置中遗漏了某些内容或者没有调用适当的API,请告诉我。

如果您的要求是立即执行作业而不附加任何计划表,那么为什么要使用Quartz调度程序呢?您可以使用其他方法来完成此任务! - Ketan
重试,任务跟踪,异步执行,定期和非定期任务的统一设计。这些功能大多已经内置。简而言之,DRY。 - CuriousMind
你可以尝试实现org.quartz.SchedulerListener接口,然后关注的方法是'void schedulerStarted();'。这样当你的调度器启动时,你就会收到这个事件并开始处理。但需要注意的是,每次暂停调度器后重新启动它时,都可能会调用此方法 - 因此你可能需要一种机制来解决这个问题! - Ketan
org.quartz.threadPool.threadCount=10,那么当前运行的调度中是否有超过10个作业?您是在应用程序启动时执行此代码还是从REST API调用它? - meadlai
1个回答

0

我遇到了同样的问题。

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


感谢您的回复。通过注释,事务管理已经启用。 - CuriousMind
然后,您可以对其进行调试,看看是Quartz添加触发器时速度慢还是调度程序从数据库中读取时速度慢? - meadlai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接