Spring Task
1.通过 Spring Task,您可以方便地在 Java 应用程序中实现定时任务,比如每天凌晨进行数据同步、每小时执行一次清理操作等。
2.1
启动类添加@EnableScheduling
注解(默认情况下,系统会自动启动一个线程)
2.2
在需要定时执行的方法上添加@Scheduled
注解即可。定时执行的方法不能有参数,并且一般没有返回值,即使有返回值也没什么用。注意定时任务所在的类要作为 Spring Bean,在类上添加@Component
注解即可。也就是说定时方法所在的类,你要放到IOC容器里面
@Component
@Slf4j //用来查看日志,日志上面精确显示到秒.这需要在properties中加logging....
@EnableAsync //开启多个线程
public class ScheduledTask {
int i =1;
@Scheduled(fixedRate = 3000)
public void task1(){
log.debug("task1->{},{}",i++,Thread.currentThread().getId());
}
@Scheduled(cron = "*/5 * * * * ?")
@Async("asyncScheduledPool") //配置类中线程类的类名
public void task2(){
log.debug("task2->{},{}",Thread.currentThread().getId());
}
}
2.3多线程(异步)定时任务
@Component
public class ExecutorConfig {
//定义核心线程数
public static final int CORE_POOL_SIZE = 5;
//定义最大线程数
public static final int MAX_POOL_SIZE = 10;
//定义线程活跃时间
public static final int KEEP_ALIVE_TIME = 2000;
//定义线程队列
public static final int BLOCKING_QUEUE_SIZE = 100;
// @Bean("asyncScheduledPool")
public Executor asyncScheduledPool(){
//自定义线程池
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
threadPoolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
threadPoolTaskExecutor.setKeepAliveSeconds(KEEP_ALIVE_TIME);
threadPoolTaskExecutor.setQueueCapacity(BLOCKING_QUEUE_SIZE);
threadPoolTaskExecutor.setThreadNamePrefix("async-scheduled-pool-");
//设置拒绝策略
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
return threadPoolTaskExecutor;
}
}
logging.root.level=error
logging.level.com.example=debug
开启异步支持
这个Enable...其实写在哪个类中都行
Api说明
fixedDelay :上次结束到下次开始执行时间间隔:
@Scheduled(fixedDelay = 4000)
fixedRate:上一次开始执行时间和下次开始时间间隔10s。如:
@Scheduled(fixedRate = 10000)
initialDelay:第一次延迟多长时间后再执行。
@Scheduled(initialDelay=1000, fixedRate=5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
cron(掌握)
@Scheduled(cron = "*/5 * * * * ?")
在线Cron表达式生成器