4.0.0
com.qs
springbootscheduled
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
2.0.0.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework
spring-context-support
2、编写定时任务类
@Component
public class ScheduledDemo {
/**
* 定时任务方法
* @Scheduled:设置定时任务
* cron属性:cron表达式。定时任务触发时间的一个字符串表达形式
*/
@Scheduled(cron = "10,15 * 18 * 2 ?")
public void scheduledMethod(){
System.out.println("定时器被触发"+new Date());
}
}
3、在启动类中开启定时任务的使用
@SpringBootApplication
@EnableScheduling //添加注解
public class App {
public static void main(String[] args){
SpringApplication.run(App.class,args);
}
}
4、cron 表达式讲解
Cron 表达式是一个字符串,分为6或7个域,每一个域代表一个含义Cron
有如下两种语法格式:
(1) Seconds Minutes Hours Day Month Week Year
(2)Seconds Minutes Hours Day Month Week
一、结构
corn从左到右(用空格隔开):秒,分,小时,月份中的日期,月份,星期中的日期,年份
二、各字段的含义
盗个图
例子:
@Scheduled(cron = “0 0 1 1 1 ?”)//每年一月的一号的 1:00:00 执行一次
@Scheduled(cron = “0 0 1 1 1,6 ?”) //一月和六月的一号的 1:00:00 执行一次
@Scheduled(cron = “0 0 1 1 1,4,7,10 ?”) //每个季度的第一个月的一号的 1:00:00 执行一次
@Scheduled(cron = “0 0 1 1 * ?”)//每月一号 1:00:00 执行一次
@Scheduled(cron=“0 0 1 * * *”) //每天凌晨 1 点执行一次
二、 SpringBoot 整合 Quartz 定时任务框架
1、Quartz 的介绍以及 Quartz 的使用思路
1.1、Quartz 的介绍
1.2、Quartz 的使用思路
1)job- 任务 - 你要做什么事?
2)Trigger- 触发器 - 你什么时候去做?
3)Scheduler- 任务调度 - 你什么时候需要去做什么事
2、Quartz 的基本使用方式
2.1、创建一个maven项目,并导入Quartz的坐标
org.quartz-scheduler
quartz
2.2.1
2.2、创建 Job 类
public class Quartz implements Job {
/**
* 任务被触发时所执行的方法
*
* @param jobExecutionContext
* @throws JobExecutionException
*/
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("Execute..."+new Date());
}
}
2.3、编写测试代码
public class QuartzMain {
public static void main(String[] args) throws SchedulerException {
//1.创建Job对象:你要做什么事?
JobDetail job=JobBuilder.newJob(Quartz.class).build();
/**
* 简单的trigger触发时间,通过Quartz提供一个方法完成简单的重复调用
* cron Trigger表达式:按照cron的表达式来给定触发的事件
*/
//2.创建Trigger对象:在什么时间做?
// Trigger trigger=TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever()).build();
Trigger trigger=TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build();
//3.创建Scheduler对象:在什么时间做什么事?
Scheduler scheduler=StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(job,trigger);
//4.启动
scheduler.start();
}
}
3、SpringBoot 整合 Quartz 定时框架
3.1、修改 pom 文件添加坐标
4.0.0
com.qs
springbootquartz
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
2.0.0.RELEASE
org.springframework.boot
spring-boot-starter-web
org.quartz-scheduler
quartz
2.2.1
slf4j-api
org.slf4j
org.springframework
spring-context-support
org.springframework
spring-tx
3.2、编写 Quartz 的启动类
@Configuration
public class QuartzConfig {
/**
* 1.创建Job对象
*/
@Bean
public JobDetailFactoryBean jobDetailFactoryBean(){
JobDetailFactoryBean factory=new JobDetailFactoryBean();
//关联我们自己的Job类
factory.setJobClass(QuartzDemo.class);
return factory;
}
/**
* 2.创建Trigger对象
* 简单的Trigger
*/
/*@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
SimpleTriggerFactoryBean factory=new SimpleTriggerFactoryBean();
//关联JobDetail对象
factory.setJobDetail(jobDetailFactoryBean.getObject());
//什么时间做 该参数表示一个执行的毫秒数
factory.setRepeatInterval(2000);
//执行次数(重复次数)
factory.setRepeatCount(5);
return factory;
}*/
/**
* Cron Trigger
*/
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
CronTriggerFactoryBean factory=new CronTriggerFactoryBean();
//关联JobDetail对象
factory.setJobDetail(jobDetailFactoryBean.getObject());
//设置触发时间
factory.setCronExpression("0/2 * * * * ?");
return factory;
}
/**
* 3.创建Scheduler对象
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean triggerFactoryBean){
SchedulerFactoryBean factory=new SchedulerFactoryBean();
//关联trigger
factory.setTriggers(triggerFactoryBean.getObject());
return factory;
}
}
3.3、修改启动类
@SpringBootApplication
@EnableScheduling //添加注解
public class App {
public static void main(String[] args){
SpringApplication.run(App.class,args);
}
}
4 Job 类中注入对象
4.1注入时会产生异常(空指针异常)
4.2、编写一个 MyAdaptableJobFactory 解决该问题
@Component("myAdaptableJobFactory")
public class MyAdaptableJobFactory extends AdaptableJobFactory {
//AutowireCapableBeanFactory:可以将一个对象添加到SpringIOC容器中,并且完成该对象的属性注入
@Autowired
private AutowireCapableBeanFactory autowireCapableBeanFactory;
/**
* 该方法需要将实例化的任务对象手动添加到SpringIOC容器中完成对象注入
* @param bundle
* @return
* @throws Exception
*/
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object obj=super.createJobInstance(bundle);
//将obj对象添加到SprinbgIOC容器中,并完成注入
this.autowireCapableBeanFactory.autowireBean(obj);
return obj;
}
}
4.3、修改 QuartzConfig 类
@Configuration
public class QuartzConfig {
/**
* 1.创建Job对象
*/
@Bean
public JobDetailFactoryBean jobDetailFactoryBean(){
JobDetailFactoryBean factory=new JobDetailFactoryBean();
//关联我们自己的Job类
factory.setJobClass(QuartzDemo.class);
return factory;
}
/**
* 2.创建Trigger对象
* 简单的Trigger
*/
/*@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
SimpleTriggerFactoryBean factory=new SimpleTriggerFactoryBean();
//关联JobDetail对象
factory.setJobDetail(jobDetailFactoryBean.getObject());
//什么时间做 该参数表示一个执行的毫秒数
factory.setRepeatInterval(2000);
//执行次数(重复次数)
factory.setRepeatCount(5);
return factory;
}*/
/**
* Cron Trigger
*/
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
CronTriggerFactoryBean factory=new CronTriggerFactoryBean();
//关联JobDetail对象
factory.setJobDetail(jobDetailFactoryBean.getObject());
//设置触发时间
factory.setCronExpression("0/2 * * * * ?");
return factory;
}
/**
* 3.创建Scheduler对象
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean triggerFactoryBean,MyAdaptableJobFactory myAdaptableJobFactory){
SchedulerFactoryBean factory=new SchedulerFactoryBean();
//关联trigger
factory.setTriggers(triggerFactoryBean.getObject());
factory.setJobFactory(myAdaptableJobFactory);
return factory;
}
}