spring 定时任务,单次执行时间超过fixedRate时的实际效果
1. 单线程执行时,fixedRate失效,实际执行频率与实际执行时间一致。
2. 定时任务加上@Async 或者定时任务调用加上@Async注解的service方法时,实际执行频率与fixedRate一致。
// 定时任务 @Scheduled(fixedRate=1000) public void callAsyncService(){ asyncService.printConsumedTime(); } // service @Async public void printConsumedTime(){ try{ StopWatch sw = new StopWatch(); long starttime = System.currentTimeMillis(); sw.start(); Thread.sleep(3000); sw.stop(); System.out.println(Thread.currentThread().getName() + " start time:"+starttime+"last time :"+sw.getTotalTimeMillis()); }catch(InterruptedException e){ } }
3. 当加上@Async但是线程不够用时,实际执行频率也不能按照fixedRate来执行。
// 配置定时任务的线程池 @Configuration public class ScheduleConfig implements SchedulingConfigure { @Bean public Executor taskSchedulerExecutor(){ ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler(); executor.setPoolSize(2); executor.setThreadNamePrefix("threadTaskScheduler"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); return executor; } @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar){ taskRegistrar.setScheduler(taskSchedulerExecutor()); } }
同样执行上面的任务。同一个线程就不能按fixedRate执行。