Java 使用@Scheduled和@EnableScheduling,但不提供任何uchbeandefinitionexception

Java 使用@Scheduled和@EnableScheduling,但不提供任何uchbeandefinitionexception,java,cron,scheduled-tasks,spring-4,Java,Cron,Scheduled Tasks,Spring 4,我已经在春季在线设置了一个cron作业,但每次我都会在Tomcat启动日志中看到这个错误: 2015-05-25 00:32:58 DEBUG ScheduledAnnotationBeanPostProcessor:191 - Could not find default TaskScheduler bean org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type

我已经在春季在线设置了一个cron作业,但每次我都会在Tomcat启动日志中看到这个错误:

2015-05-25 00:32:58 DEBUG ScheduledAnnotationBeanPostProcessor:191 - 
Could not find default TaskScheduler bean org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined

2015-05-25 00:32:58 DEBUG ScheduledAnnotationBeanPostProcessor:202 - Could not    
find default ScheduledExecutorService bean
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying    
bean of type [org.springframework.scheduling.TaskScheduler] is defined
以及用于实现cron的两个java类:

  • @Configuration类:

    @Configuration
    @EnableScheduling
    public class ClearTokenStoreCronEnable {    
      final static Logger log =   
      LoggerFactory.getLogger(ClearTokenStoreCronEnable.class);
      private @Autowired TokenStoreRepository tokenStoreRepository; 
    }
    
  • 和Cron作业类:

    @Service
    public class ClearTokenStoreWorkerService {
    
        final static Logger log = LoggerFactory.getLogger(ClearTokenStoreWorkerService.class);
        private @Autowired TokenStoreRepository tokenStoreRepository;
    
        //@Scheduled(fixedDelay=5000)
        //run daily at midnight
        @Scheduled(cron = "0 0 * * * *")
        public void tokenStoreTable() {
            log.debug("tokenstore table truncated - start");
            tokenStoreRepository.deleteAll();
            log.debug("tokenstore table truncated - end");
        }
    }
    
顺便说一句,cron作业在午夜运行,但在其他时间似乎也是随机运行的。不确定这是错误还是我的cron表达式错误:
@Scheduled(cron=“0****”)

我现在主要关心的是为什么我会出现
scheduledNotationbeanPostProcessor
错误?它正在寻找TaskScheduler和ScheduleXector服务。
我只需要每天启动一次。我不做任何并发处理,也不需要多线程。这些错误最终是有害的还是我需要修复它们?

编辑:最好的答案是,它涉及到创建一个执行者:

@Configuration
@EnableAsync
public class AppContext extends WebMvcConfigurationSupport {
    @Bean
    public Executor taskExecutor() {
        return new SimpleAsyncTaskExecutor();
    }
}
以前的(尽管仍然有效):

NoSuchBeanDefinitionException以调试严重性记录,可以安全地忽略。如果您查看ScheduledNotationBeanPostProcessor的源代码,您会看到它首先尝试获取TaskScheduler,然后是ScheduledExecutorService,然后继续“返回默认计划程序”:

您可以通过在上设置至少一个信息严重性来删除异常 org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor,如

<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
可以在中找到语法。 我不确定“?”字符,因为尽管页面上说

“月日”和“周日”字段允许使用“?”字符。用于指定“无特定值”。当您需要在这两个字段中的一个字段中指定某个内容,而不是在另一个字段中指定某个内容时,这非常有用

该页上的示例实际使用了什么?即使另一个字段为*。 IMHO all应该使用just*,因此为了在每个午夜执行,表达式应该是

0 0 0 * * *

我同意你可以忽略它,但仅仅改变严重性并不能解决它。我也有同样的问题,但我使用xml而不是注释,在我的例子中,这是因为我没有在bean定义中包含executor。因此,添加此选项可以修复此问题:


我希望有帮助


关于。

根据异常信息
无法找到默认TaskScheduler bean
,配置应定义
TaskScheduler
,而不是“Executor”


为了解决这个问题,只需在config中创建任务调度器bean

@Bean
    public TaskScheduler taskScheduler() {
        return new ConcurrentTaskScheduler();
    }

使用Spring Boot 2.0.5,我不断获得:

2018-11-20 11:35:48.046  INFO 64418 --- [  restartedMain] s.a.ScheduledAnnotationBeanPostProcessor : 
No TaskScheduler/ScheduledExecutorService bean found for scheduled processing
摆脱它的唯一方法似乎是在
@Configuration
类中使用
SchedulingConfigurer
接口,如下所示:

@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
    private final int POOL_SIZE = 10;

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

        threadPoolTaskScheduler.setPoolSize(POOL_SIZE);
        threadPoolTaskScheduler.setThreadNamePrefix("my-scheduled-task-pool-");
        threadPoolTaskScheduler.initialize();

        scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    }
}

注意:这是取自

我发现上面使用的初始cron表达式不正确。每天午夜触发一次的正确表达式是:@Scheduled(cron=“0**?”),这不是一个错误;虽然poolSize可以是1或更高,但似乎不起作用。值得一提的是:这是一个INFO语句,而不是一个错误。该语句只是说它找不到任何自定义调度程序配置(这很好)。
@Bean
    public TaskScheduler taskScheduler() {
        return new ConcurrentTaskScheduler();
    }
2018-11-20 11:35:48.046  INFO 64418 --- [  restartedMain] s.a.ScheduledAnnotationBeanPostProcessor : 
No TaskScheduler/ScheduledExecutorService bean found for scheduled processing
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
    private final int POOL_SIZE = 10;

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

        threadPoolTaskScheduler.setPoolSize(POOL_SIZE);
        threadPoolTaskScheduler.setThreadNamePrefix("my-scheduled-task-pool-");
        threadPoolTaskScheduler.initialize();

        scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    }
}