(1)使用@Scheduled注解实现
@AllArgsConstructor
@Slf4j
@Component
public class ScheduledTasks {
@Scheduled(cron="0 55 23 ? * *")
public void startTask(){
log.info("任务在执行...");
}
(2)利用线程池ScheduledExecutorService
@Component
@Slf4j
@Order(1)
public class SoftGatewayHeartbeat implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
log.info("任务在执行...");
}
},2,cycle, TimeUnit.SECONDS);
}
}
利用线程池做定时任务有个问题,就是任务启动时机的问题,案例采用了线程池跟随系统一起启动,类实现了ApplicationRunner接口的run方法,注解的@Order(1)主要用来对多个随系统一起启动的任务进行排序。 一般这种适用于设计一些心跳场景的设计和实现。
|