1.使用springboot自带的定时任务需要在启动类上添加注解
@EnableAsync // 启用异步任务 @EnableScheduling // 启用定时任务
2.如果是异步定时任务则需要配置线程池
- /**
- * 定义异步任务执行的线程池
- */
- @Configuration
- public class TaskPoolConfig {
- @Bean("asyncExecutor1")
- public Executor taskExecutor1 () {
-
- ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
- // 核心线程数10:线程池创建时候初始化的线程数
- executor.setCorePoolSize(10);
- // 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
- executor.setMaxPoolSize(20);
- // 缓冲队列200:用来缓冲执行任务的队列
- executor.setQueueCapacity(200);
- // 允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
- executor.setKeepAliveSeconds(60);
- // 线程池名的前缀:设置好了之后可以方便定位处理任务所在的线程池
- executor.setThreadNamePrefix("asyncTask1-");
- /*
- 线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,
- 当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;
- 如果执行程序已关闭,则会丢弃该任务
- */
- executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
- // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
- executor.setWaitForTasksToCompleteOnShutdown(true);
- // 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。
- executor.setAwaitTerminationSeconds(600);
- return executor;
- }
- }
3 .异步定时任务示例
-
- @Component
- public class AsyncTask {
- private static final Logger LOGGER = LoggerFactory.getLogger(AsyncTask.class) ;
- // 只配置了一个 asyncExecutor1 不指定也会默认使用
- @Async
- public void asyncTask0 () {
- try{
- Thread.sleep(6000);
- }catch (Exception e){
- e.printStackTrace();
- }
- LOGGER.info("======异步任务结束1======");
- }
- @Async("asyncExecutor1")
- public void asyncTask1 () {
- try{
- Thread.sleep(5000);
- }catch (Exception e){
- e.printStackTrace();
- }
- LOGGER.info("======异步任务结束2======");
- }
- }
4.异步定时任务测试
- @RestController
- public class TaskController {
- @Resource
- private AsyncTask asyncTask ;
- @RequestMapping("/asyncTask")
- public String asyncTask (){
- asyncTask.asyncTask0();
- asyncTask.asyncTask1();
- return "成功" ;
- }
- }
5.时间定时任务:
使用@Scheduled开启定时任务,可以通过内置的属性来指定执行的时间规则,也可以使用CRON表达式
- /**
- * 时间定时任务
- */
- @Component
- public class TimeTask {
- Logger LOG = LoggerFactory.getLogger(TimeTask.class.getName()) ;
- private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
-
- /**
- * 每6秒打印一次系统时间
- */
- @Scheduled(fixedDelay = 6000)
- public void systemDate (){
- LOG.info("当前时间::::"+format.format(new Date()));
- }
-
- /*
- * @Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行
- * @Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
- * @Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
- * @Scheduled(cron="/5") :通过cron表达式定义规则
- */
- }