1 @Scheduled是一个可以启动定时任务的注解,使用方式如下:
@Scheduled(cron = "*/5 * * * * ?")
public void leanScheduled(){
//定时任务
}
2 全域搜索Scheduled.class可在ScheduledAnnotationBeanPostProcessor类找到其实现
3 分析processScheduled方法
protected void processScheduled(Scheduled scheduled, Method method, Object bean) {
//创建任务,并通过反射调用定时任务
Runnable runnable = createRunnable(bean, method);
...
...
//把不同的的Scheduled 加入tasks
if (fixedDelay >= 0) {
...
...
tasks.add(this.registrar.scheduleFixedDelayTask(new FixedDelayTask(runnable, fixedDelay, initialDelay)));
}
if (fixedRate >= 0) {
...
...
tasks.add(this.registrar.scheduleFixedRateTask(new FixedRateTask(runnable, fixedRate, initialDelay)));
}
//最后tasks加入this.scheduledTasks
synchronized (this.scheduledTasks) {
Set<ScheduledTask> regTasks = this.scheduledTasks.computeIfAbsent(bean, key -> new LinkedHashSet<>(4));
regTasks.addAll(tasks);
}
}
4找到谁调用的private final Map<Object, Set<ScheduledTask>> scheduledTasks = new IdentityHashMap<>(16); 中的scheduledTasks,即可找到谁实现定时:ScheduledAnnotationBeanPostProcessor全文只有
public Set<ScheduledTask> getScheduledTasks() {}暴露给外部使用