SpringBoot提供了非常简单的定时任务配置方法,不再像之前需要配置很多Quartz的文件了。
首先看一个简单的静态任务:
@Configuration
@EnableScheduling
@Slf4j
public class StaticScheduledTasks {
@Autowired
private JCacheCacheManager jCacheCacheManager;
@Value("${info.ehcache.smsTimeCount}")
private String smsTimeCount;
/**
* 每天0点清除同一手机发送短信计数
*/
@Scheduled(cron = "0 0 0 */1 * ?")
private void configureTasks() {
jCacheCacheManager.getCache(smsTimeCount).clear();
log.info("Ehcache: " + smsTimeCount + " cleared");
}
}
类上添加@EnableScheduling注解, 来启用定时任务能力, 然后用@Scheduled(cron=cron表达式)来定期执行一个任务就可以了, 非常方便。
要动态添加一个任务, 可以用Java提供的ScheduledExecutorService:
public static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(50);
scheduler.scheduleAtFixedRate(() -> {
log.debug("start heartbeatTask --> " + ctx.channel().remoteAddress());
ctx.channel().writeAndFlush(new PingWebSocketFrame());
}, 5, 15, TimeUnit.SECONDS);
也可以用Spring封装的TaskScheduler:
@Autowired
private TaskScheduler taskScheduler;
public void test(){
ScheduledFuture future = taskScheduler.scheduleAtFixedRate(()->{
System.out.println(LocalDateTime.now());
}, Instant.now(), Duration.ofSeconds(5));
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
future.cancel(true);
return;
}
TaskScheduler提供了更加丰富的能力, 比如可以使用CronTrigger来规划任务,等等。Spring的官方文档提供了很详细的使用及配置说明, 就不赘述了。