怎样实现普通定时任务?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
常见方式是启用EnableScheduling并在受管方法上声明Scheduled,选择fixedDelay、fixedRate或cron。它提供进程内调度,不保证多实例只执行一份,也不自动保存停机期间错过的触发。任务是否可重入、执行多久及失败如何处理,仍要明确。
讲清原理
fixedDelay通常从前一次完成到下一次开始计间隔,fixedRate按计划节奏触发;实际并发与延迟受调度器和任务执行方式影响。cron还应明确时区,Spring常用六字段表达式,不能直接照搬所有Unix或Quartz写法。
网络或数据库任务应有超时、有限并发和幂等边界。把慢任务放在共享单线程调度器中,可能拖延其他任务;更大线程池也不等于可以无上限打满依赖。
例子与易错点
示例只验证任务声明与cron计算,不靠睡眠等待“刚好触发一次”判断调度正确。跨实例唯一执行需要另外的协调与持久状态,见分布式任务题。
以下为 Java 21 类成员示例,放入同一外部类中使用,依赖 Boot4.1.2 / Framework7.0.10。cron值“-”用于关闭此声明,验证外部开关与未注册任务;不等待真实时钟触发。
@org.springframework.context.annotation.Configuration(proxyBeanMethods=false)
@org.springframework.scheduling.annotation.EnableScheduling
static class SchedulingConfig {
@org.springframework.context.annotation.Bean
Task task() { return new Task(); }
}
static class Task {
@org.springframework.scheduling.annotation.Scheduled(cron="${lesson16.cron:-}")
void tick() { throw new AssertionError("disabled-task-must-not-run"); }
}
相关题:第 11 题、第 52 题、第 62 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。