Spring 定时任务 --基于Spring boot

简单介绍:Spring3.0  通过@EnableScheduling来开启定时任务,通过@Scheduled注解来创建定时任务。Spring schedule 可以看成一个轻量级的Quartz,而且使用起来比Quartz简单许多 

@EnableScheduling  注解:它的作用是发现注解 @Scheduled的任务并由后台执行。没有它的话将无法执行定时任务。

官方文档原文:@EnableScheduling ensures that a background task executor is created. Without it, nothing gets scheduled.

@Scheduled中的参数说明

@Scheduled(fixedRate=2000):上一次开始执行时间点后2秒再次执行;上一个任务的开始到下一个任务开始时间的间隔
 
@Scheduled(fixedDelay=2000):上一次执行完毕时间点后2秒再次执行;表示上一次任务执行完成后多久再次执行
 
@Scheduled(initialDelay=1000, fixedDelay=2000):第一次延迟1秒执行,然后在上一次执行完毕时间点后2秒再次执行;
 
@Scheduled(cron="* * * * * ?"):按cron规则执行。指定任务在特定时间执行
  •  cron:强调任务在某时某分某刻执行的定时任务用cron表达式,;
  •  fixedDelay:强调任务间隔的定时任务  用fixedDelay 或者 fixedRate。  

1.配置定时任务,基于Springboot,只要引入起步依赖就可以,不需要其它配置。

2.创建并开启定时任务

package com.example.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
@EnableScheduling
public class ScheduledJob {

	Logger logger = LoggerFactory.getLogger(this.getClass());

	@Scheduled(fixedDelay = 3000)
	public void testScheduledFixedDelay() {
		logger.info("===this is fixed delay");
	}

	@Scheduled(fixedRate = 5000)
	public void testScheduledFixedRate() {
		logger.info("===this is fixed Rate");
	}

	@Scheduled(cron = "* * * * * ?")
	public void testScheduledCron() {

	}
}

启动项目 ,会打出如下log


3.开启多线程处理定时任务

Spring schedule的定时任务默认是单线,参考 Spring Boot 定时任务单线程和多线程。是因为在源码中,从ScheduledAnnotationBeanPostProcessor类开始一路找下去。在ScheduledTaskRegistrar(定时任务注册类)中的ScheduleTasks中又这样一段判断:

if (this.taskScheduler == null) {
	this.localExecutor = Executors.newSingleThreadScheduledExecutor();
	this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
}

所以要开启多线程,就可以实现多线程 执行定时任务: 

 
package com.example.demo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
public class ThreadConfiguration {
	@Bean
	public TaskScheduler taskScheduler() {
		ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
		scheduler.setPoolSize(20);
		return scheduler;
	}
}

再次运行项目,打出log如下


 

4.开启多线程 执行定时任务---方法2

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
 
/**
 * 多线程执行定时任务
 * 所有的定时任务都放在一个线程池中,定时任务启动时使用不同都线程。
 */
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {    
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    	ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
    	taskScheduler.setPoolSize(10);
    	taskScheduler.initialize();
    	taskRegistrar.setTaskScheduler(taskScheduler);
    }
}

 

5.几种任务调度方式

几种任务调度的 Java 实现方法与比较

深入解读Quartz任务调度器

spring-boot-2.0.3之quartz集成,数据源问题,源码探究

spring-boot-2.0.3之quartz集成,不是你想的那样哦!

39. Quartz Scheduler

Job Scheduler

posted on 2020-06-14 19:13  dreamstar  阅读(71)  评论(0编辑  收藏  举报