一:Scheduled定时任务器
Scheduled定时任务器:是Spring3.0以后自带的一个定时器
1.在pom文件中添加坐标
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
<groupId>com.springboot</groupId>
<artifactId>25-springboot-Scheduled</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 修改jdc版本 -->
<properties>
<java.version>1.7</java.version>
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version>
</properties>
<dependencies>
<!--SpringBoot启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- thymeleaf启动器的坐标 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 添加Scheduled的坐标 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
</dependencies>
</project>
2.编写定时任务类
/**
* Scheduled定时任务
* @author Administrator
*
*/
@Component
public class ScheduledDemo {
/**
* 定时任务方法
* @Scheduled:设置定时任务
* cron属性:cron表达式。定时任务触发是时间的一个字符串表达形式
*/
@Scheduled(cron="0/2 * * * * ?")
public void scheduleMethod() {
System.out.println("定时器被触发啦!"+new Date());
}
}
3.在启动类中开启定时任务的使用
/**
* SpringBoot启动类
* @author Administrator
*
*/
@SpringBootApplication
@EnableScheduling
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
二:SpringBoot整合Quartz定时框架任务
1.Quartz的使用的思路
(1) job-表示任务-表示要做的事情
(2)Trigger-触发器-表示什么时候去做
(3)Scheduled-任务调度-什么时候需要去做
2.Quartz的使用
2.1修改pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springboot</groupId>
<artifactId>26-quartz-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- Quartz坐标 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
</dependencies>
</project>
2.2创建job类
/**
* 定义任务类
* @author Administrator
*
*/
public class QuartzDemo implements Job {
/**
* 任务被触发时所执行的方法
*/
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("Execute..."+new Date());
}
}
2.3编写测试代码
public class QuartzMain {
public static void main(String[] args) throws Exception {
//1.创建Job对象--你要做什么事情?
JobDetail job = JobBuilder.newJob(QuartzDemo.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.创建Scheduled对象:在什么时间做什么事?
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(job,trigger);
//启动
scheduler.start();
}
}
3.SpringBoot整合Quartz定时框架
3.1修改pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
<groupId>com.springboot</groupId>
<artifactId>27-springboot-quartz</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 修改jdc版本 -->
<properties>
<java.version>1.7</java.version>
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version>
</properties>
<dependencies>
<!--SpringBoot启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- thymeleaf启动器的坐标 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- Quartz坐标 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加Scheduled坐标 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- Sprng tx 坐标 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
</dependencies>
</project>
3.2编写Quartz的配置类
/**
* Quartz配置类
* @author Administrator
*
*/
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;
}
/**
* 3.创建Scheduler对象
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean(SimpleTriggerFactoryBean simpleTriggerFactoryBean) {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
//关联trigger
factory.setTriggers(simpleTriggerFactoryBean.getObject());
return factory;
}
}
3.3 编写启动类
/**
* SpringBoot 整合Quartz案例
* @author Administrator
*
*/
@SpringBootApplication
@EnableScheduling
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
4.Job类中注入对象
注入时会产生异常
1.解决这个异常要编写一个MyAdaptableJobFactory解决该问题
@Component("myAdaptableJobFactory")
public class MyAdaptableJobFactory extends AdaptableJobFactory{
//AutowireCapableBeanFactory 可以将一个对象添加到SpringIOC容器中,并且完成该对象的注入
@Autowired
private AutowireCapableBeanFactory autowireCapableBeanFactory;
@Override
/**
* 该方法需要实例化的任务对象手动添加到SpringIOC容器中并且完成对象的注入
*/
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object obj = super.createJobInstance(bundle);
//将obj对象添加到Spring IOC容器中,并且完成注入
autowireCapableBeanFactory.autowireBean(obj);
return obj;
}
}
2.修改QuartzConfig类
/**
* Quartz配置类
* @author Administrator
*
*/
@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();
factory.setJobDetail(jobDetailFactoryBean.getObject());
//设置触发时间
factory.setCronExpression("0/2 * * * * ?");
return factory;
}
/**
* 3.创建Scheduler对象
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean,MyAdaptableJobFactory myAdaptableJobFactory) {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
//关联trigger
factory.setTriggers(cronTriggerFactoryBean.getObject());
factory.setJobFactory(myAdaptableJobFactory);
return factory;
}
}