Java 使用@Scheduled和@EnableScheduling,但不提供任何uchbeandefinitionexception
我已经在春季在线设置了一个cron作业,但每次我都会在Tomcat启动日志中看到这个错误: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
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"); } }
@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);
}
}