Spring Boot定时任务

简单的定时任务可以使用Spring的@Scheduled实现,而复杂些的定时任务则可以集成Quarzt实现

一:@Scheduled

  1. 创建一个Spring Boot Web 工程,添加web倚赖即可
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

  1. 在启动类上添加 @EnableScheduling 以开启定时任务

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

import java.util.Date;

@SpringBootApplication
@EnableScheduling
public class ScheduledApplication {
    public static void main(String[] args) {
        SpringApplication.run(ScheduledApplication.class, args);
    }
}
  1. 配置定时任务

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MySchedule {
    //@Scheduled: 用来标注定时任务,其中fixedDelay =1000 表示当前任务执行结束1秒后开启另一个任务
    @Scheduled(fixedDelay = 10000)
    public void fixedDelay() {
        System.out.println("fixedDelay:"+new Date());
    }
    //fixedRate表示当前任务执行开始2秒后开启另外一个定时任务
    @Scheduled(fixedRate = 2000)
    public void fixedRate() {
        System.out.println("fixedRate:"+new Date());
    }
    //initialDelay表示首次执行的延迟时间
    @Scheduled(initialDelay = 1000,fixedRate = 2000)
    public void initialDelay() {
        System.out.println("initialDelay:"+new Date());
    }
    //cron = "0 * * * * ?" 表达式表示该任务每分钟执行一次
    @Scheduled(cron = "0 * * * * ?")
    public void cron() {
        System.out.println("cron:"+new Date());
    }
}

配置完后即可启动项目,项目日志部分打印如下:
在这里插入图片描述

二:Quartz

  1. Quartz由Java写成,可以继承到任何Java应用中,使用Quartz 可以创建简单或者复杂的执行计划。其中在Spring Boot中集成Quartz 和在Spring 中继承较为类似。主要提供三个bean: JobDetail,Trigger以及SchedulerFacory
  2. 整合Spring Boot
    创建好Spring Boot项目,添加Quartz倚赖:
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
  • 创建两个Job

import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MyFirstJob {
    public void sayHello() {
        System.out.println("MyFirstJob:sayHello:"+new Date());
    }
}


import org.quartz.JobExecutionContext;
import org.springframework.scheduling.quartz.QuartzJobBean;

import java.util.Date;

public class MySecondJob extends QuartzJobBean {
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    //如果不提前直接注册为Bean,也可继承QuartzJobBean,并重写下面的方法
    @Override
    protected void executeInternal(JobExecutionContext context){
        System.out.println("hello:"+name+":"+new Date());
    }
}

  • 创建QuartzConfig 对JobDetail和Trigger进行配置,其中涉及了Cron表达式

import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.SimpleTrigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.*;

@Configuration
public class QuartzConfig {
    //jobDetail1配置方式一:通过MethodInvokingJobDetailFactoryBean配置 ,
    // 只需要指定Job的实例名和要调用的方法即可
    @Bean
    MethodInvokingJobDetailFactoryBean jobDetail1() {
        MethodInvokingJobDetailFactoryBean bean =
                new MethodInvokingJobDetailFactoryBean();
        bean.setTargetBeanName("myFirstJob");
        bean.setTargetMethod("sayHello");
        return bean;
    }
    //配置方式二: 通过JobDetailFactoryBean,只需要setJobClass,
    //通过jobDataMap 进行传递参数即可
    @Bean
    JobDetailFactoryBean jobDetail2() {
        JobDetailFactoryBean bean = new JobDetailFactoryBean();
        bean.setJobClass(MySecondJob.class);
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("name","sang");
        bean.setJobDataMap(jobDataMap);
        bean.setDurability(true);
        return bean;
    }

    //Trigger的常用实现一:simpleTrigger
    @Bean
    SimpleTriggerFactoryBean simpleTrigger() {
        SimpleTriggerFactoryBean bean =
                new SimpleTriggerFactoryBean();
        bean.setJobDetail(jobDetail1().getObject());
        bean.setRepeatCount(3);//任务循环次数
        bean.setStartDelay(1000);//任务启动延迟时间
        bean.setRepeatInterval(2000);//任务的时间间隔
        return bean;
    }
    //Trigger的常用实现二:cronTrigger
    @Bean
    CronTriggerFactoryBean cronTrigger() {

        CronTriggerFactoryBean bean =
                new CronTriggerFactoryBean();
        bean.setJobDetail(jobDetail2().getObject());
        bean.setCronExpression("* * * * * ?");//配置cron表达式
        return bean;
    }
    //创建schedulerFactory,并配置Trigger
    @Bean
    SchedulerFactoryBean schedulerFactory() {
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        SimpleTrigger simpleTrigger = simpleTrigger().getObject();
        CronTrigger cronTrigger = cronTrigger().getObject();
        bean.setTriggers(simpleTrigger,cronTrigger);
        return bean;
    }
}

  • 启动项目进行测试,其中部分日志如下:其中 MyFirstJob在循环执行了三次之后不再执行,MySecondJob,每隔一秒执行一次,永不停止在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值