在数据处理场景中经常用到定时对数据ETL操作,springboot原生带有的ScheduleTask也可以提供丰富的定时任务操作,这里简单介绍集成使用,如果业务不复杂只是简单的定时执行任务则直接使用注解,若涉及到定时任务本身的变动(比如动态地读取库中crontab等)需要定制化地设计ScheduleTask类,按照上述描述可以分类静态定时任务和动态定时任务;
目录
静态ScheduleTask
动态ScheduleTask
模拟cron信息
定时任务配置
输出
静态ScheduleTask
静态ScheduleTask指的是crontab本身设置不变动,固定的周期设置,此种动态方法直接在应用接口上增加注释即可,比如每7秒打印一句话,或者每7秒完成一次接口调用;
package com.yzg.demo.config.Schedule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import java.time.LocalDateTime;
@Configuration
// 定时任务
@EnableScheduling
public class ScheduleTaskOne {
private final Logger logger= LoggerFactory.getLogger(ScheduleTaskOne.class);
// 秒分时日月周
@Scheduled(cron = "0/7 * * * * ?")
private void configureTasks() {
logger.info("定时任务每7秒打印: " + LocalDateTime.now());
}
}
?动态ScheduleTask
?静态的调度器需要重启应用,当我们需要在前端提供用户自定义的crontab任务时,就需要读取库里的数据库信息拿到cron信息,然后按照动态地cron调用接口,不需要重启应用,这就需要定制化的设计ScheduleTask配置类;
模拟cron信息
用户自定义的crontab信息;
package com.yzg.demo.model;
public class Crontable {
public int id;
public String info;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public Crontable(int id, String info) {
this.id = id;
this.info = info;
}
}
定时任务配置
当然一般不在配置类中写接口调用,这里这是测试写法,读取库里的crontab信息后,调用teacherimpl的查询方法,修改库里的cron信息后,任务相应地会改变;
package com.yzg.demo.config.Schedule;
import com.yzg.demo.service.CrontableImpl;
import com.yzg.demo.service.TeacherServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.util.concurrent.ExecutionException;
@Configuration
@EnableScheduling
public class ScheduleTaskTwo implements SchedulingConfigurer {
@Autowired
TeacherServiceImpl teacherimpl; //实际业务操作
@Autowired
CrontableImpl crontableImpl; //读取数据库crontab操作
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
final Logger logger= LoggerFactory.getLogger(ScheduleTaskTwo.class);
taskRegistrar.addTriggerTask(
() -> {
// 从数据库读取corntabl配置
logger.info("模拟读取数据库中的crontab配置: " + LocalDateTime.now().toLocalTime());
try {
// 执行定时的接口任务
logger.info(teacherimpl.getStudents().get().get(0).toString());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
},
triggerContext -> {
String cron = crontableImpl.getCronInfo();
if (StringUtils.isEmpty(cron)) {
}
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}
}
输出
|