Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

怎样实现普通定时任务?

查看完整题解

参考回答

直接回答

常见方式是启用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 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。