闽公网安备 35020302035485号
2.基于接口SchedulingConfigurer
@Scheduled(cron = "*/2 * * * * ?")
public void testA() throws InterruptedException {
log.info("testA 执行==============");
Thread.sleep(5000);
}
@Scheduled(cron = "*/2 * * * * ?")
public void testB() throws InterruptedException {
log.info("testB 执行==============");
Thread.sleep(5000);
}
执行结果2023-03-20 09:15:46.007 INFO 64180 --- [ scheduling-1] org.example.schedu.TestJob : testA 执行============== 2023-03-20 09:15:51.009 INFO 64180 --- [ scheduling-1] org.example.schedu.TestJob : testB 执行============== 2023-03-20 09:15:56.015 INFO 64180 --- [ scheduling-1] org.example.schedu.TestJob : testA 执行============== 2023-03-20 09:16:01.019 INFO 64180 --- [ scheduling-1] org.example.schedu.TestJob : testB 执行============== 2023-03-20 09:16:06.028 INFO 64180 --- [ scheduling-1] org.example.schedu.TestJob : testA 执行============== 2023-03-20 09:16:11.038 INFO 64180 --- [ scheduling-1] org.example.schedu.TestJob : testB 执行==============可以明显看出两个任务是串行执行,后面会介绍如何实现多任务并行执行
@Configuration
public class TestJob2 implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
//堆代码 duidaima.com
//模拟多任务,实际可以从数据库或配置文件获取
for(int i =0;i<3;i++){
int finalI = i;
//1.添加任务内容(Runnable)
Runnable runnable = () -> {
System.out.println("执行动态定时任务"+ finalI +":" + LocalDateTime.now());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
};
//2.任务触发器
Trigger trigger = triggerContext -> {
//获取定时触发器,可以从数据库或配置文件获取最新记录,更新触发器实现定时间隔的动态调整
CronTrigger cronTrigger = new CronTrigger("*/2 * * * * ?");
return cronTrigger.nextExecutionTime(triggerContext);
};
//3.注册任务
scheduledTaskRegistrar.addTriggerTask(runnable, trigger);
}
}
}
执行结果执行动态定时任务0:2023-03-20T09:47:38.010 执行动态定时任务1:2023-03-20T09:47:43.015 执行动态定时任务2:2023-03-20T09:47:48.019 执行动态定时任务0:2023-03-20T09:47:53.026 执行动态定时任务1:2023-03-20T09:47:58.040 执行动态定时任务2:2023-03-20T09:48:03.048可以明显看出两个任务是串行执行,后面会介绍如何实现多任务并行执行
@Configuration
public class ScheduleConfig {
/**
* 修复同一时间无法执行多个定时任务问题。@Scheduled默认是单线程的
*/
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
//核心线程池数量,方法: 返回可用处理器的Java虚拟机的数量。
taskScheduler.setPoolSize(Runtime.getRuntime().availableProcessors() * 2);
return taskScheduler;
}
}
方式二:spring:
application:
name: test-task
task:
scheduling:
pool:
size: 8 #配置Scheduled定时任务为多线程
方式三:@Configuration
public class ScheduleConfig1 implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setScheduler(
new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2)
);
}
}
注意: