目录
1.背景
定时任务注解@Scheduled(cron="0 0/10 * * * ?")大家都会用,但是一旦需要配置时间,这种方式就不可行了,本文介绍了可以配置的方式。
2.简介
本文采用SchedulingConfigurer从配置中读取定时任务信息,装载到定时任务中。
任务执行时进行SpringBean方式反射加载执行。
3.代码实现
3.1.主类
/**
* 定时任务
*/
@Configuration
@Slf4j
public class ScheduledTask implements SchedulingConfigurer {
@Autowired
ScheduledConfig scheduledConfig;
/**
* 转换首字母小写
*
* @param str
* @return
*/
public static String lowerFirstCapse(String str) {
char[] chars = str.toCharArray();
chars[0] += 32;
return String.valueOf(chars);
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledConfig.getItemList().forEach(scheduledConfigItem -> {
Runnable runnable=new Runnable() {
@Override
public 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: searchDataReload
cron: 0 32 14 * * ?
className: com.whq.myapp.service.SearchService
method: dataReload