springboot定时任务和Quartz的整合使用

目录

  • 1 引言
  • 2 使用springboot自带的定时任务
    • 2.1 开启服务
    • 2.2 配置任务线程池
    • 2.3 编写任务
  • 3 使用Quartz定时任务
    • 3.1 pom.xml
    • 3.2 开启服务
    • 3.3 任务类
      • 3.3.1 任务类1
      • 3.3.2 任务类2
    • 3.4 配置类
      • 3.4.1 配置类1
      • 3.4.2 配置类2

1 引言

业务上需要定时执行一些逻辑代码

2 使用springboot自带的定时任务

2.1 开启服务

在启动类上添加注解@EnableScheduling

2.2 配置任务线程池

默认线程池为1,此处改为10

spring:
  task:
    scheduling:
      pool:
        size: 1

2.3 编写任务

@Component
public class Task1 {

    @Scheduled(cron = "* * * * * ?")
    public void task1() throws InterruptedException {
        Thread.sleep(1000*5);
        System.out.println("task1:"+Thread.currentThread());
    }

    @Scheduled(cron = "* * * * * ?")
    public void task2(){
        System.out.println("task2:"+Thread.currentThread());
    }

}

3 使用Quartz定时任务

为什么要使用quartz,支持cluster,支持持久化到数据库,不怕服务宕机,等等有很多优点,但是使用起来比较复杂

3.1 pom.xml

<dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-quartzartifactId>
dependency>

3.2 开启服务

在启动类上添加注解@EnableScheduling

3.3 任务类

3.3.1 任务类1

public class QuartzTask1 extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String time = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
        System.out.println("QuartzTask1现在的时间:"+time+"--->"+Thread.currentThread());
    }
}

3.3.2 任务类2

public class QuartzTask2 extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String time = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
        System.out.println("QuartzTask2现在的时间:"+time+"--->"+Thread.currentThread());
    }
}

3.4 配置类

注意:有多个任务时 需要多个配置类与之对应

3.4.1 配置类1

@Configuration
public class QuartzConfig {

    //构建 JobDetail 有多个任务时不能重名
    @Bean
    public JobDetail MyJobDetail1() {
        //自己编写的具体的任务类
        return JobBuilder.newJob(QuartzTask1.class)
                //给JobDetail起一个id, 不写默认自动自动生成唯一的TriggerKey
                .withIdentity("myTaskId")
                /**
                 * JobDetail内部的一个map,可以存储有关Job的数据,这里的数据
                 * 可通过Job类中executeInternal方法的参数进行获取
                 */
                .usingJobData("name","dog")
                //即使没有Trigger关联时也不删除该Jobdetail
                .storeDurably()
                .build();
    }


    //构建 Trigger 及 Scheduler
    @Bean
    public Trigger downloadTrigger() {
        return TriggerBuilder.newTrigger()
                .forJob(MyJobDetail1())  //关联上面的 jobDetail
                .withIdentity("myTaskId")
                .usingJobData("trigger_download","download")
                //cron 表达式设置每隔 5 秒执行一次
                .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *"))
                .build();
    }
}

3.4.2 配置类2

@Configuration
public class QuartzConfig2 {


    //构建 JobDetail
    @Bean
    public JobDetail MyJobDetail2() {
        //自己编写的具体的任务类
        return JobBuilder.newJob(QuartzTask2.class)
                //即使没有Trigger关联时也不删除该Jobdetail
                .storeDurably()
                .build();
    }

    //构建 Trigger 及 Scheduler
    @Bean
    public Trigger downloadTrigger2() {
        return TriggerBuilder.newTrigger()
                .forJob(MyJobDetail2())
                .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *"))
                .build();
    }
}

你可能感兴趣的:(SpringBoot)