SpringBoot几种定时任务的实现方式

2024-12-29 08:51:53
推荐回答(1个)
回答1:

第一种比较简单

第二种

@SpringBootApplication
/*
*  开启对定时任务的支持
*  在相应的方法上添加@Scheduled声明需要执行的定时任务。
*/
@EnableScheduling
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

@SpringBootApplication
/*
*  开启对定时任务的支持
*  在相应的方法上添加@Scheduled声明需要执行的定时任务。
*/
@EnableScheduling
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

/*把普通pojo实例化到spring容器中,相当于配置文件中的

若想动态改变其值需要继承SchedulingConfigurer
*/
public class AutoSchedule  implements  SchedulingConfigurer{

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

private static final String DEFAULT_CRON = "0/5 * * * * ?";
private String cron = DEFAULT_CRON;

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//            Runnable(线程接口类) 和CronTrigger(定时任务触发器)
taskRegistrar.addTriggerTask(() -> {
// 定时任务的业务逻辑
System.out.println("动态修改定时任务cron参数,当前时间:" + dateFormat.format(new Date()));
}, (triggerContext) -> {
// 定时任务触发,可修改定时任务的执行周期
CronTrigger trigger = new CronTrigger(cron);
Date nextExecDate = trigger.nextExecutionTime(triggerContext);
return nextExecDate;
});
}

public void setCron(String cron) {
System.out.println("当前cron="+this.cron+"->将被改变为:"+cron);
this.cron = cron;
}

}

第三种

@RestController
@Component
public class CrudSchelud  {
//用threadPoolTaskScheduler 类实现对任务的定时调度功能,
//重写CronTrigger触发器,任务却被不断调用3
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;

private ScheduledFuture future;

@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
return new ThreadPoolTaskScheduler();
}

@RequestMapping("/startCron")
public String startCron() {
future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("0/5 * * * * *"));
System.out.println("DynamicTask.startCron()");
return "startCron";
}

@RequestMapping("/stopCron")
public String stopCron() {
if (future != null) {
future.cancel(true);
}
System.out.println("DynamicTask.stopCron()");
return "stopCron";
}

@RequestMapping("/changeCron10")
public String startCron10() {
stopCron();// 先停止,在开启.
future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("*/10 * * * * *"));
System.out.println("DynamicTask.startCron10()");
return "changeCron10";
}

private class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("DynamicTask.MyRunnable.run()," + new Date());
}
}


}