定时任务的实现
使用@Scheduled
启动类上添加@EnableScheduling启动定时任务
@SpringBootApplication
@EnableScheduling
public class ScheduledApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduledApplication.class, args);
}
}
使用@Scheduled(fixedDelay = )
@Service
public class HelloService {
@Scheduled(fixedDelay = 2000)//前面任务结束时间后面任务开始时间间隔2秒
public void fixedDelay(){
System.out.println("fixedDelay>>"+ new Date());
}
}
运行结果
fixedDelay>>Sun May 10 19:43:20 CST 2020
fixedDelay>>Sun May 10 19:43:22 CST 2020
fixedDelay>>Sun May 10 19:43:24 CST 2020
fixedDelay>>Sun May 10 19:43:26 CST 2020
fixedDelay>>Sun May 10 19:43:28 CST 2020
使用@Scheduled(fixedRate = )
@Service
public class HelloService {
@Scheduled(fixedRate = 2000)//第一个任务没有结束,2秒后第二个任务也启动
public void fixedDelay(){
System.out.println("fixedDelay>>"+ new Date());
}
}
运行结果
fixedDelay>>Sun May 10 19:47:48 CST 2020
fixedDelay>>Sun May 10 19:47:50 CST 2020
fixedDelay>>Sun May 10 19:47:52 CST 2020
使用Scheduled(cron = )
链接: cron表达式参考.
链接: cron表达式在线生成工具.
@Service
public class HelloService {
@Scheduled(cron = "0/5 * * * * ?")
public void fixedDelay(){
System.out.println("fixedDelay>>"+ new Date());
}
}
使用@quartz
启动类上添加@EnableScheduling启动定时任务
@SpringBootApplication
@EnableScheduling
public class ScheduledApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduledApplication.class, args);
}
}
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
方式一
作业内容
package org.akk.scheduled.job;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyFirstJob {
public void sayHello(){
System.out.println("first job" + new Date());
}
}
定时任务的配置
@Configuration
public class QuartzConfig {
//配置的作业bean
@Bean
MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(){
MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
//设置目标类注意首字母小写
bean.setTargetBeanName("myFirstJob");
//设置设置目标方法
bean.setTargetMethod("sayHello");
return bean;
}
//配置的触发器bean
@Bean
SimpleTriggerFactoryBean simpleTriggerFactoryBean(){
SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
//绑定作业bean
factoryBean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
//开始时间
factoryBean.setStartTime(new Date());
//间隔
factoryBean.setRepeatInterval(2000);
//执行多少次默认无限循环以下指定执行3次
factoryBean.setRepeatCount(3);
return factoryBean;
}
启动定时任务
@Bean
SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean bean = new SchedulerFactoryBean();
bean.setTriggers(simpleTriggerFactoryBean().getObject());
return bean;
}
方式二
作业内容
package org.akk.scheduled.job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.util.Date;
public class MySecondJob extends QuartzJobBean {
public void setName(String name) {
this.name = name;
}
private String name;
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("second job" + name + new Date());
}
}
定时任务的配置
@Configuration
public class QuartzConfig {
//配置的作业bean
@Bean
JobDetailFactoryBean jobDetailFactoryBean(){
JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
JobDataMap map = new JobDataMap();
// 给参数赋值
map.put("name","akk");
factoryBean.setJobDataMap(map);
//指定作业类 由于作业类继承了QuartzJobBean 默认的会走重写的executeInternal
factoryBean.setJobClass(MySecondJob.class);
return factoryBean;
}
//配置的触发器bean
@Bean
CronTriggerFactoryBean cronTriggerFactoryBean(){
CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean();
// 装配作业类配置
factoryBean.setJobDetail(jobDetailFactoryBean().getObject());
// 使用cron指定间隔时间
factoryBean.setCronExpression("* * * * * ?");
return factoryBean;
}
启动定时任务
@Bean
SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean bean = new SchedulerFactoryBean();
bean.setTriggers(cronTriggerFactoryBean().getObject());
return bean;
}
测试结果
first 重复了3次 第一次不算
second每秒执行一次
first jobSun May 10 21:12:19 CST 2020
second jobakkSun May 10 21:12:19 CST 2020
2020-05-10 21:12:19.647 INFO 10496 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2020-05-10 21:12:19.652 INFO 10496 --- [ main] org.akk.scheduled.ScheduledApplication : Started ScheduledApplication in 2.676 seconds (JVM running for 4.173)
second jobakkSun May 10 21:12:20 CST 2020
second jobakkSun May 10 21:12:21 CST 2020
first jobSun May 10 21:12:21 CST 2020
second jobakkSun May 10 21:12:22 CST 2020
second jobakkSun May 10 21:12:23 CST 2020
first jobSun May 10 21:12:23 CST 2020
second jobakkSun May 10 21:12:24 CST 2020
second jobakkSun May 10 21:12:25 CST 2020
first jobSun May 10 21:12:25 CST 2020
second jobakkSun May 10 21:12:26 CST 2020