网站首页> 文章专栏> springboot 中定时任务
我们在编程中,都会使用到定时任务来跑,比如数据库同步呀,或者token获取呀
xml或者注解
3)定时执行的方法加上注解 @Scheduled(fixedRate=2000) 定期(每2s)执行一次
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication //一个注解顶下面3个
@EnableScheduling //开启定时任务
public class FbiaoApplication {
public static void main(String[] args) {
SpringApplication.run(FbiaoApplication.class, args);
}
}
@Component
public class TestTask {
@Scheduled(fixedRate=2000) //两秒执行一次
public void sum(){
System.out.println("当前时间:"+new Date());
}
}
各种使用方法spring crontab
@Scheduled(cron="*/1 * * * * *")//每秒执行一次
public void testTask(){
System.out.println("当前时间"+new Date());
}
@Scheduled(fixedDelay = 2000) //与 fixedDelayString=“2000”等价(字符串形式)
public void testTask() throws InterruptedException {
Thread.sleep(4000L);
System.out.println("当前时间"+new Date());
}
常用cron表达式
每隔5秒执行一次:*/5 * * * * ?每隔1分钟执行一次:0 */1 * * * ? 每天23点执行一次:0 0 23 * * ? 每天凌晨1点执行一次:ga 每月1号凌晨1点执行一次:0 0 1 1 * ? 每月最后一天23点执行一次:0 0 23 L * ? 每周星期天凌晨1点实行一次:0 0 1 ? * L 在26分、29分、33分执行一次:0 26,29,33 * * * ? 每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
3,基于接口时间调整
@Component
public class CronSchedule implements SchedulingConfigurer {
private static final SimpleDateFormat detefarmat = new SimpleDateFormat("HH:mm:ss");
private static final String DEFAULT_CRON = "0/5 * * * * ?";
private String cron = DEFAULT_CRON;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(
//1.添加任务内容(Runnable)
this::startTask,
//2.设置执行周期(Trigger)
triggerContext -> {
String corn = cron;
return new CronTrigger(corn).nextExecutionTime(triggerContext);
}
);
}
private void startTask() {
System.out.println("==========执行定时任务===========");
}
public void setCron(String cron) {
System.out.println("cron更变为" + cron);
this.cron = cron;
}
}
创建一个controller
@Autowired CronSchedule cronSchedule; @RequestMapping(value = "/updateCron") public String updateCron(@RequestParam("cron") String cron) { System.out.println("======== 改变定时任务 =========="); cronSchedule.setCron(cron); return "success"; }
@Component public class CronSchedule implements SchedulingConfigurer { @Autowired private TbScheduleTaskMapper tbScheduleTaskMapper; private int count = 0; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { //第一次启动注入 Listtasks = getAllScheduleTasks(); System.out.println("====== 定时任务启动了 ========="); //启动的时候会执行一次,这里我们用count > 0 的时候证明启动了一次可执行定时方法 if (tasks.size() > 0){ for (TbScheduleTask task : tasks) { taskRegistrar.addTriggerTask(getRunnable(task), getTrigger(task)); } count++; } } /** * 定时时间 * @param tbScheduleTask * @return */ private Trigger getTrigger(TbScheduleTask tbScheduleTask) { return new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { //这里查询数据库定时任务有被修改吗,修改则替换 TbScheduleTask tbScheduleTaskdb = tbScheduleTaskMapper.selectByPrimaryKey(tbScheduleTask.getSeqId()); String cron = null; if (tbScheduleTaskdb != null && !tbScheduleTask.getCron().equals(tbScheduleTaskdb.getCron())){ cron = tbScheduleTaskdb.getCron(); }else { cron = tbScheduleTask.getCron(); } CronTrigger trigger = new CronTrigger(cron); return trigger.nextExecutionTime(triggerContext); } }; } /** * 获取Runnable * 执行定时任务 * @param tbScheduleTask * @return */ private Runnable getRunnable(TbScheduleTask tbScheduleTask) { return new Runnable() { @Override public void run() { if (count != 0){ System.out.println("==========tbScheduleTask=========="+tbScheduleTask.getTaskName()); } } }; } /** * 获取要执行的所有任务 * @return */ private List getAllScheduleTasks() { TbScheduleTaskExample example = new TbScheduleTaskExample(); example.createCriteria().andStatusEqualTo(1); return tbScheduleTaskMapper.selectByExample(example); } }
2024-04-07 10:17:02 回复