目录
1.背景
2.简介
3.代码实现
3.1.主类
3.2.配置类
3.3.配置示例
1.背景
定时任务注解@Scheduled(cron="0 0/10 * * * ?")大家都会用,但是一旦需要配置时间,这种方式就不可行了,本文介绍了可以配置的方式。
2.简介
本文采用SchedulingConfigurer从配置中读取定时任务信息,装载到定时任务中。
任务执行时进行SpringBean方式反射加载执行。
3.代码实现
3.1.主类
/*** 定时任务*/
@Configuration
@Slf4j
public class ScheduledTask implements SchedulingConfigurer {@AutowiredScheduledConfig scheduledConfig;/*** 转换首字母小写** @param str* @return*/public static String lowerFirstCapse(String str) {char[] chars = str.toCharArray();chars[0] += 32;return String.valueOf(chars);}@Overridepublic void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {scheduledConfig.getItemList().forEach(scheduledConfigItem -> {Runnable runnable=new Runnable() {@Overridepublic void run() {Class<?> clazz;try {clazz = Class.forName(scheduledConfigItem.getClassName());String className = lowerFirstCapse(clazz.getSimpleName());Object bean = (Object) SpringUtil.getBean(className);Method method = ReflectionUtils.findMethod(bean.getClass(), scheduledConfigItem.getMethod());log.info("任务{}已启动",scheduledConfigItem.getName());ReflectionUtils.invokeMethod(method, bean);log.info("任务{}已结束",scheduledConfigItem.getName());} catch (ClassNotFoundException e) {e.printStackTrace();}}};scheduledTaskRegistrar.addCronTask(runnable,scheduledConfigItem.getCron());log.info("任务{}已加载",scheduledConfigItem.getName());});}
}
3.2.配置类
@Configuration
@ConfigurationProperties(prefix = "scheduled-config")
@Data
public class ScheduledConfig {private List<ScheduledConfigItem> itemList;
}@Data
public class ScheduledConfigItem {private String name;private String cron;private String className;private String method;
}
3.3.配置示例
scheduled-config:itemList:- name: searchDataReloadcron: 0 32 14 * * ?className: com.whq.myapp.service.SearchServicemethod: dataReload