gpt4 book ai didi

java - 如何在 spring-boot 中启用 TaskScheduler?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:20:14 25 4
gpt4 key购买 nike

我正在使用 spring-boot 来设置 spring 默认值。我想使用 @EnableScheduling 机制,并根据条件安排我的任务。

因此我必须实现 SchedulingConfigurer 并显式设置 TaskScheduler

但是在注入(inject) TaskScheduler 时,出现以下错误。但是为什么spring-boot不自动提供相应的Scheduler呢?

@Configuration
@EnableAutoConfiguration
@EnableScheduling
public class AppConfig {

}

@Service
public class JobService implements SchedulingConfigurer {
@Autowired
private TaskScheduler taskScheduler;

//schedule the task dynamically
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskScheduler); //fails
taskRegistrar.addTriggerTask(task, trigger);
}
}

错误:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.scheduling.TaskScheduler; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.scheduling.TaskScheduler] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
... 15 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.scheduling.TaskScheduler] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1308)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 17 more

最佳答案

您不需要在 ScheduledTaskRegistrar 上设置调度程序。如果尚未配置,则默认为包装单线程计划执行程序的 ConcurrentTaskScheduler:

if (this.taskScheduler == null) {
this.localExecutor = Executors.newSingleThreadScheduledExecutor();
this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
}

如果您对这个默认调度程序感到满意,您可以删除 TaskScheduler 的 Autowiring 以及在 ScheduledTaskRegistrar 上设置它的调用。此外,正如 Marten 在评论中所建议的那样,您应该使您的 SchedulingConfigurer 成为配置类而不是服务。

这些更改使您的代码看起来像这样:

@Configuration
static class TaskConfiguration implements SchedulingConfigurer {

//schedule the task dynamically
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(task, trigger);
}
}

关于java - 如何在 spring-boot 中启用 TaskScheduler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28452400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com