配置了 <task:annotation-driven/> 和 @Scheduled(cron="0/5 * * * * ?"),但任務方法不執行,無報錯日誌。
// 必須加在類上,否則 Spring 不會創建 Bean,自然不會解析 @Scheduled
@Component
public class TaskJob {
@Scheduled(cron = "0/5 * * * * ?")
public void job() { ... }
}
確認 <context:component-scan base-package="com.tc.mytask"/> 覆蓋該類包路徑。
默認單線程執行,若任務耗時超過間隔或拋異常,後續任務會阻塞/停止。
@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar registrar) {
registrar.setTaskScheduler(taskScheduler());
}
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10); // 核心線程數
scheduler.setThreadNamePrefix("scheduled-");
scheduler.setErrorHandler(t -> log.error("定時任務異常", t)); // 關鍵:異常處理
return scheduler;
}
}
// 正確:每5秒
"0/5 * * * * ?"
// 錯誤寫法示例
"*/5 * * * * ?" // Spring 不支持秒級 *
"0 0/5 * * * ?" // 這是每5分鐘
public void 無參方法static(除非配置 proxyTargetClass)若類上有 @Transactional,CGLIB 代理可能導致 @Scheduled 失效。解決:將定時任務類單獨拆分,或使用 @EnableAsync + @Async 異步執行。
ScheduledAnnotationBeanPostProcessor 確認註冊ScheduledTaskRegistrar#scheduleTasksfixedRate=5000 排除 Cron 解析問題org.springframework.scheduling DEBUG 日誌Spring 官方指南:https://spring.io/guides/gs/scheduling-tasks/
系統檢查以上 6 點,99% 可定位 @Scheduled 不執行根因。