SpringBoot-定时任务的实现

使用@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

猜你喜欢

转载自blog.csdn.net/weixin_39232166/article/details/106040898