Spring 3.0后提供Spring Task实现任务调度,支持按日历调度,相比Quartz功能稍简单,但是在开发基本够用,支 持注解编程方式。
使用
启用在spring boot 启动类上添加注解: @EnableScheduling
串行任务
两个任务方法由一个线程串行执行,方法执行完成task2再执行。
测试代码:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* @author LYQ
* @since 2018/12/19 14:55
*/
@Component
public class TestTask {
@Scheduled(fixedRate = 3000)//每隔5秒执行一次
public void task1(){
System.out.println("定时任务测试1");
}
}
参数说明:https://www.jianshu.com/p/1defb0f22ed1
并行任务
多个任务由不同的线程在并行执行,互不影响。
@Configuration
@EnableScheduling
public class AsyncTaskConfig implements SchedulingConfigurer, AsyncConfigurer {
//线程池线程数量
private int corePoolSize = 5;
@Bean
public ThreadPoolTaskScheduler taskScheduler()
{
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();//初始化线程池
scheduler.setPoolSize(corePoolSize);//线程池容量
return scheduler;
}
@Override
public Executor getAsyncExecutor() {
Executor executor = taskScheduler();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setTaskScheduler(taskScheduler());
}
}
注意:将@EnableScheduling添加到此配置类上,SpringBoot启动类上不用再添加@EnableScheduling
@Scheduled 参数说明
1. cron
该参数接收一个cron表达式,cron表达式是一个字符串,字符串以5或6个空格隔开,分开共6或7个域,每一个域代表一个含义。
cron表达式使用占位符
time: cron: */5 * * * * * interval: 5
@Scheduled(cron="${time.cron}")
void testPlaceholder1() {
System.out.println("Execute at " + System.currentTimeMillis());
}
@Scheduled(cron="*/${time.interval} * * * * *")
void testPlaceholder2() {
System.out.println("Execute at " + System.currentTimeMillis());
}
2. zone
时区,接收一个java.util.TimeZone#ID。cron表达式会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比如我们一般使用的时区Asia/Shanghai。该字段我们一般留空。
3. fixedDelay
上一次执行完毕时间点之后多长时间再执行。如:
//上一次执行完毕时间点之后10秒再执行 @Scheduled(fixedDelay = 10000)
4. fixedDelayString
与 3. fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。如:
//上一次执行完毕时间点之后10秒再执行
@Scheduled(fixedDelayString = "10000")
占位符的使用(配置文件中有配置:time.fixedDelay=10000):
@Scheduled(fixedDelayString = "${time.fixedDelay}")
void testFixedDelayString() {
System.out.println("Execute at " + System.currentTimeMillis());
}
应用
注解随机延迟
当有多个节点时不希望它们同时运行。所以我想为初始延迟设置一个随机值,以使它们相互抵消。
import org.springframework.scheduling.annotation.Scheduled; @Scheduled(fixedRate = 600000, initialDelay = <random number between 0 and 10 minutes> )
不幸的是,我在这里只能使用常量表达式。有没有其他方法可以解决这个问题?我想到了使用Spring表达式语言。
可以通过Spring Expression Language配置initialDelay:
@Scheduled(fixedRate = 600000, initialDelayString = "#{ T(java.util.concurrent.ThreadLocalRandom).current().nextInt(10*60*1000) }" )
标签:Scheduled,spring,void,boot,System,cron,线程,Scheduling,public From: https://blog.51cto.com/u_10176086/5951836