概述
Spring Scheduling是Spring Framework中的一个模块,用于支持任务调度和定时任务。它提供了一种简单而强大的方式来执行周期性任务、定时任务和一次性任务。自springboot中可以有多种方式实现一个方法定时执行。
使用ThreadPoolTaskScheduler
配置ThreadPoolTaskScheduler
package com.zlennon.scheduling.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.scheduling.support.PeriodicTrigger;
import java.util.concurrent.TimeUnit;
@Configuration
@ComponentScan(basePackages = "com.zlennon")
public class TaskSchedulerConfig {
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(5);
threadPoolTaskScheduler.setThreadNamePrefix("ThreadPoolTaskScheduler");
return threadPoolTaskScheduler;
}
@Bean
public CronTrigger cronTrigger() {
return new CronTrigger("10 * * * * ?");
}
@Bean
public PeriodicTrigger periodicTrigger() {
return new PeriodicTrigger(2000, TimeUnit.MICROSECONDS);
}
@Bean
public PeriodicTrigger periodicFixedDelayTrigger() {
PeriodicTrigger periodicTrigger = new PeriodicTrigger(2000, TimeUnit.MICROSECONDS);
periodicTrigger.setFixedRate(true);
periodicTrigger.setInitialDelay(1000);
return periodicTrigger;
}
}
执行
@Component
public class ThreadPoolTaskSchedulerExamples {
@Autowired
private ThreadPoolTaskScheduler taskScheduler;
@Autowired
private CronTrigger cronTrigger;
@Autowired
private PeriodicTrigger periodicTrigger;
//@PostConstruct
public void scheduleRunnableWithCronTrigger() {
taskScheduler.schedule(new RunnableTask("Current Date"), new Date());
taskScheduler.scheduleWithFixedDelay(new RunnableTask("Fixed 1 second Delay"), 1000);
taskScheduler.scheduleWithFixedDelay(new RunnableTask("Current Date Fixed 1 second Delay"), new Date(), 1000);
taskScheduler.scheduleAtFixedRate(new RunnableTask("Fixed Rate of 2 seconds"), new Date(), 2000);
taskScheduler.scheduleAtFixedRate(new RunnableTask("Fixed Rate of 2 seconds"), 2000);
taskScheduler.schedule(new RunnableTask("Cron Trigger"), cronTrigger);
taskScheduler.schedule(new RunnableTask("Periodic Trigger"), periodicTrigger);
}
static class RunnableTask implements Runnable {
private String message;
public RunnableTask(String message) {
this.message = message;
}
@Override
public void run() {
System.out.println("Runnable Task with " + message + " on thread " + Thread.currentThread().getName());
}
}
使用注解@Scheduled
使用Scheduled可以很方便的按条件执行定时任务
@Component()
@EnableScheduling
public class ScheduledAnnotationExecute {
@Scheduled(fixedDelay = 1000)
public void scheduleFixedDelayTask() {
System.out.println("Fixed delay task sssssssss - " + System.currentTimeMillis() / 1000);
}
@Scheduled(fixedDelayString = "${fixedDelay.in.milliseconds}")
public void scheduleFixedDelayTaskUsingExpression() {
System.out.println("Fixed delay task - " + System.currentTimeMillis() / 1000);
}
@Scheduled(fixedDelay = 1000, initialDelay = 2000)
public void scheduleFixedDelayWithInitialDelayTask() {
System.out.println("Fixed delay task with one second initial delay - " + System.currentTimeMillis() / 1000);
}
@Scheduled(fixedRate = 1000)
public void scheduleFixedRateTask() {
System.out.println("Fixed rate task - " + System.currentTimeMillis() / 1000);
}
@Scheduled(fixedRateString = "${fixedRate.in.milliseconds}")
public void scheduleFixedRateTaskUsingExpression() {
System.out.println("Fixed rate task - " + System.currentTimeMillis() / 1000);
}
@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void scheduleFixedRateWithInitialDelayTask() {
long now = System.currentTimeMillis() / 1000;
System.out.println("Fixed rate task with one second initial delay - " + now);
}
/**
* Scheduled task is executed at 10:15 AM on the 15th day of every month
*/
@Scheduled(cron = "0 15 10 15 * ?")
public void scheduleTaskUsingCronExpression() {
long now = System.currentTimeMillis() / 1000;
System.out.println("schedule tasks using cron jobs - " + now);
}
@Scheduled(cron = "${cron.expression}")
public void scheduleTaskUsingExternalizedCronExpression() {
System.out.println("schedule tasks using externalized cron expressions - " + System.currentTimeMillis() / 1000);
}
SchedulingConfigurer中可以自定义下次执行的时间,如下次执行的时间tickService.getDelay()计算得出
@EnableScheduling
public class DynamicSchedulingConfig implements SchedulingConfigurer {
@Autowired
private TickService tickService;
@Bean
public Executor taskExecutor() {
return Executors.newSingleThreadScheduledExecutor();
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
taskRegistrar.addTriggerTask(
() -> tickService.tick(),
context -> {
Optional<Date> lastCompletionTime =
Optional.ofNullable(context.lastCompletionTime());
Instant nextExecutionTime =
lastCompletionTime.orElseGet(Date::new).toInstant()
.plusMillis(tickService.getDelay());
return Date.from(nextExecutionTime).toInstant();
}
);
}
}
---------------------
@Service
public class TickService {
private long delay = 0;
public long getDelay() {
this.delay += 1000;
System.out.println("delaying " + this.delay + " milliseconds...");
return this.delay;
}
public void tick() {
final long now = System.currentTimeMillis() / 1000;
System.out
.println("schedule tasks with dynamic delay - " + now);
}
}
使用quartz
见:sprinboot-quartz
源码位置:spring-scheduling
分享到: