一、使用springboot默认提供的线程执行 下面已经足够使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@EnableScheduling
@Component
public class SchedulingDemo {
private Logger logger = LoggerFactory.getLogger(SchedulingDemo.class);
/**
* 删除数据定时
*/
private static final String CORE_FORMAT = "0/5 * * * * ?";
@Scheduled(cron = CORE_FORMAT)
public void scheduleLimitRule() {
try {
System.out.println(" Timer: Delete Export Template File With Schedule At {} Begin....."+ CORE_FORMAT);
System.out.println("================= I already run");
} catch (Exception e){
e.printStackTrace();
System.out.println(" Timer: Delete Delete Export Template File Meets An Error {}"+ e.getMessage());
}
}
private int fixedDelayCount = 1;
private int fixedRateCount = 1;
private int initialDelayCount = 1;
private int cronCount = 1;
@Scheduled(fixedDelay = 5000) //fixedDelay = 5000表示当前方法执行完毕5000ms后,Spring scheduling会再次调用该方法
public void testFixDelay() {
logger.info("===fixedDelay: 第{}次执行方法", fixedDelayCount++);
}
@Scheduled(fixedRate = 5000) //fixedRate = 5000表示当前方法开始执行5000ms后,Spring scheduling会再次调用该方法
public void testFixedRate() {
logger.info("===fixedRate: 第{}次执行方法", fixedRateCount++);
}
@Scheduled(initialDelay = 1000, fixedRate = 5000) //initialDelay = 1000表示延迟1000ms执行第一次任务
public void testInitialDelay() {
logger.info("===initialDelay: 第{}次执行方法", initialDelayCount++);
}
@Scheduled(cron = "0/1 * * * * ?") //cron接受cron表达式,根据cron表达式确定定时规则
public void testCron() {
logger.info("===initialDelay: 第{}次执行方法", cronCount++);
}
}
==============================================愚蠢的分割线======================================================
需要走自己规划好的线程池,加上如下部分即可
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.concurrent.*;
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
//设定一个长度20的定时任务线程池
scheduledTaskRegistrar.setScheduler(taskExecutor());
//Executors.newScheduledThreadPool(20)
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
// Executors.newScheduledThreadPool(15); //指定线程池大小
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10,Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
}
参考:
//https://blog.csdn.net/u013456370/article/details/79411952 //https://segmentfault.com/a/1190000020299913?utm_source=tag-newest
本文深入探讨了在SpringBoot中如何使用内置线程池执行定时任务,包括使用@EnableScheduling注解激活定时任务,通过@Scheduled注解设置定时规则,如fixedDelay、fixedRate、initialDelay和cron表达式。同时,介绍了如何自定义线程池来更好地控制任务执行。
2453

被折叠的 条评论
为什么被折叠?



