思路
- 在 .yaml 或 .properties中配置定时任务 cron 表达式
- 建一个定时任务配置读取类,读取 .properties 中的配置表达式
- 写自己的定时任务类,实现Runnable 接口
- 建一个定时任务调度类(类名随意:ScheduledTasks.java ),负责调度所有的任务
- 从Application启动任务调度
具体实现
1、新建 taskcommon.properties中配置定时任务 cron 表达式
#### 定时任务
#每月1号每月1号凌晨1点执行一次 统计上一个月的缴费
job.taskCronMap[costCountCron] = 0 */5 * * * ?
2、新建 TaskPropertiesConfig.ava , 用来读取定时任务的表达式
- ConfigurationProperties(prefix = “job”) 配置的是配置文件里前缀为job 的配置属性
- PropertySource(“classpath:datapro/taskcommon.properties”) 配置读取文件的路径,classpath标识项目中静态资源的根目录,例如 我的配置文件存放路径目录 :huohuang\apartmanagement\src\main\resources\datapro
- taskCronMap 与配置文件中配置的属性名对应,读取时才能赋值。
package com.qianlong.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @author:
* @Date:
* @Description:
*/
@Component
@ConfigurationProperties(prefix = "job")
@PropertySource("classpath:datapro/taskcommon.properties")
public class TaskPropertiesConfig {
/**
* 定时任务的cron 表达式集合
*/
private Map<String, String> taskCronMap;
public Map<String, String> getTaskCronMap() {
return taskCronMap;
}
public void setTaskCronMap(Map<String, String> taskCronMap) {
this.taskCronMap = taskCronMap;
}
}
3、新建定时任务类 CostCountJob,java ,并实现Runnable 接口。
- @PostConstruct 该任务在项目启动时先立即执行一次。
package com.qianlong.job;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* @author:
* @Date:
* @Description:
*/
@Component
public class CostCountJob implements Runnable {
@Override
@PostConstruct
public void run() {
System.out.println( "定时任务启动" );
}
}
4、新建任务调度类 ScheduledTasks.java ,所有的任务调度都由该类调度。
package com.qianlong.job;
import com.qianlong.config.TaskPropertiesConfig;
import org.apache.commons.lang.StringUtils;
import org.mybatis.logging.Logger;
import org.mybatis.logging.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @author:
* @Date:
* @Description: 定时任务调度类
*/
@Component
public class ScheduledTasks {
@Autowired
private TaskScheduler taskScheduler;
@Autowired
private TaskPropertiesConfig tascConfig;
@Autowired
private CostCountJob costCountJob;
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
public void scheduleAllCrons() {
Map<String, String> taskCronMap = tascConfig.getTaskCronMap();
// 配置文件taskcommon.properties 中配置了 costCountCron 的corn表达式,定时任务costCountJob才启动
if(taskCronMap!=null && taskCronMap.size()>0){
String corn = taskCronMap.get("costCountCron");
if(StringUtils.isNotEmpty(corn)){
taskScheduler.schedule(costCountJob, new CronTrigger(corn));
}
}
}
}
5、springboot启动类MainApplication 中启动任务调度。
package com;
import com.qianlong.job.ScheduledTasks;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @author: Administrator
* @Date: 2021/4/17 13:32
* @Description:
*/
@EnableTransactionManagement
@SpringBootApplication
@MapperScan("com.qianlong.mapper")
public class ProMainApplication {
@Bean
public TaskScheduler taskScheduler() {
return new ConcurrentTaskScheduler();
}
public static void main(String[] args) {
ConfigurableApplicationContext app =SpringApplication.run(ProMainApplication.class,args);
System.out.println( "启动成功");
//定时任务调度启动
ScheduledTasks scheduledTasks = app.getBean(ScheduledTasks.class);
scheduledTasks.scheduleAllCrons();
}
}