上一章我们分析了Spring定时任务Schedule的源码,这里我们在做一个控制定时任务的案例。
业务开发中经常使用spring的schedule作为应用定时任务,但是由于@EnableScheduling注解的滥用,导致项目中到处都可能加了该注解,若是在本项目中那么可以通过全局搜索进行排除,只留一个来作为项目内是否开启定时任务的开关,但是若项目中依赖的maven模块中,因为非源码里面添加的@EnableScheduling注解我们就没办法排除,为了在开发环境中排除定时任务干扰我们控制台日志(定时任务滚动日志太多了)干扰自己debug,可以通过spring提供的扩展配置,修改定时任务注册中心的任务,从而达到彻底关闭开发环境的定时任务。
@Configuration
@Profile("dev")
@ConditionalOnProperty(name = "schedule.shutdown")
public class ScheduleCloseConf implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
Field[] declaredFields = taskRegistrar.getClass().getDeclaredFields();
List<Field> list = Arrays.stream(declaredFields)
.filter(f -> List.class.isAssignableFrom(f.getType()))
.collect(Collectors.toList());
for (Field f : list) {
try {
//access sec
f.setAccessible(true);
List<Object> o = (List<Object>) f.get(taskRegistrar);
if (Objects.nonNull(o)) {
//清除所有扫描到的定时任务
o.clear();
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
}
在jvm启动参数中添加schedule.shutdown参数就可以关闭所有的定时任务。