1. @Scheduled 注解(最常用)
基于 Spring 内置的 TaskScheduler,简单轻量,适合单机、非高可靠场景。
✅ 特点:
- 使用简单,只需加注解;
- 支持 cron 表达式、固定延迟(fixedDelay)、固定速率(fixedRate);
- 默认使用单线程执行(可配置线程池);
- 不支持分布式环境下的任务去重(多实例会重复执行)。
🔧 示例:
@Component
public class MyTask {
@Scheduled(cron = "0 0 2 * * ?") // 每天凌晨2点
public void dailySync() {
// 执行同步逻辑
}
@Scheduled(fixedDelay = 60_000) // 上次完成1分钟后执行
public void reportStatus() {
// ...
}
}
⚙️ 启用:
@SpringBootApplication
@EnableScheduling // 必须加上
public class Application { ... }
🛠 自定义线程池(避免阻塞):
@Configuration
@EnableScheduling
public class SchedulingConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar registrar) {
registrar.setScheduler(Executors.newScheduledThreadPool(5));
}
}
2. TaskScheduler 编程式调度
适用于需要动态创建/取消定时任务的场景(如用户配置触发时间)。
✅ 特点:
- 灵活控制任务生命周期;
- 可取消任务(返回 ScheduledFuture);
- 仍为单机方案。
🔧 示例:
@Service
public class DynamicTaskService {
@Autowired
private TaskScheduler taskScheduler;
private ScheduledFuture<?> future;
public void startTask() {
future = taskScheduler.scheduleAtFixedRate(() -> {
// 执行逻辑
}, Duration.ofMinutes(5));
}
public void cancelTask() {
if (future != null) {
future.cancel(true);
}
}
}
3. Quartz Scheduler(企业级)
功能强大的开源作业调度框架,支持持久化、集群、复杂依赖等。
✅ 特点:
- 任务可持久化到数据库;
- 支持分布式集群部署(通过数据库锁实现任务去重);
- 支持任务分组、监听器、恢复机制;
- 配置较复杂,资源开销较大。
🔧 Spring Boot 集成:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
示例 Job:
public class SyncJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) {
// 执行同步
}
}
// 配置 JobDetail 和 Trigger
@Bean
public JobDetail syncJobDetail() {
return JobBuilder.newJob(SyncJob.class)
.withIdentity("syncJob")
.storeDurably()
.build();
}
@Bean
public Trigger syncTrigger() {
return TriggerBuilder.newTrigger()
.forJob(syncJobDetail())
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 3 * * ?"))
.build();
}
✅ 适用场景:需要高可靠、跨实例唯一执行、任务历史追踪的企业系统。
4. 消息队列 + 延迟消息(分布式推荐)
利用 RabbitMQ(TTL+死信队列)、RocketMQ(延迟消息)、Kafka(配合时间轮)等实现。
✅ 特点:
- 天然支持分布式;
- 可靠性高(消息持久化、ACK 机制);
- 适合"一次性延迟任务"或"任务队列"场景;
- 不适合高频周期任务(如每分钟执行)。
🔧 示例(RabbitMQ 延迟任务):
- 发送消息时设置 TTL(如 24 小时);
- 消息过期后进入死信队列;
- 消费者处理"到期同步任务"。
✅ 适用场景:订单超时关闭、设备心跳检测、延迟重试等。
5. XXL-JOB / Elastic-Job / PowerJob(分布式任务调度平台)
第三方分布式任务调度中间件,提供 Web 控制台、分片、失败重试、日志查看等。
✅ 特点:
- 中心化管理任务;
- 支持分片广播、故障转移;
- 与业务代码解耦;
- 需要额外部署调度中心。
🔧 以 XXL-JOB 为例:
@XxlJob("deviceSyncJob")
public void deviceSync() throws Exception {
String param = XxlJobHelper.getJobParam();
// 执行同步逻辑
XxlJobHelper.handleSuccess();
}
✅ 适用场景:大型微服务架构,需统一管理数百个定时任务。
📊 对比总结
| 方式 | 单机 | 分布式 | 持久化 | 动态调整 | 复杂度 | 推荐场景 |
|---|---|---|---|---|---|---|
| @Scheduled | ✅ | ❌ | ❌ | ❌ | 低 | 简单后台任务 |
| TaskScheduler | ✅ | ❌ | ❌ | ✅ | 中 | 动态启停任务 |
| Quartz | ✅ | ✅ | ✅ | ⚠️(有限) | 高 | 企业级可靠任务 |
| 消息队列延迟 | ✅ | ✅ | ✅ | ✅ | 中 | 延迟/一次性任务 |
| XXL-JOB 等平台 | ✅ | ✅ | ✅ | ✅ | 高 | 大型分布式系统 |
💡 建议选择策略:
- 单体应用、简单任务 → @Scheduled
- 需要动态控制任务 → TaskScheduler
- 多实例部署、要求任务只执行一次 → Quartz(DB 锁) 或 XXL-JOB
- 延迟触发(如 30 分钟后提醒) → 消息队列延迟消息
- 大规模微服务、需运维界面 → XXL-JOB / PowerJob
对于你提到的 DataSyncManager 迁移场景:
- 若为单机服务 → 用 @Scheduled + 分布式锁(Redis);
- 若为多实例集群 → 推荐 Quartz 或 XXL-JOB。