SpringBoot实现定时任务

定时任务是开发中比较常见的功能之一,如定时统计订单数、数据库备份、定时统计博客访客等,简单的定时任务可以直接通过Spring中的@Scheduled注解来实现,复杂的定时任务则可以通过集成Quartz来实现。

Scheduled

@Scheduled是由Spring提供的定时任务注解,使用方便,配置简单,可以解决工作中大部分的定时任务需求。使用方式如下:

(1)、创建工程
首先创建一个普通的Spring Boot Web工程,添加Web依赖即可。

(2)、开启定时任务
在项目启动中添加@EnableScheduling注解开启定时任务。

(3)、配置定时任务
定时任务只要通过@Scheduled注解进行配置,代码如下:

@Component
public class MySchedule {

    @Scheduled(fixedDelay = 1000)
    public void fixedDelay(){
        System.out.println("fixedDelay:"+new Date());
    }

    @Scheduled(fixedDelay = 2000)
    public void fixedRate(){
        System.out.println("fixedRate:"+new Date());
    }

    @Scheduled(initialDelay = 1000,fixedDelay = 2000)
    public void initialDelay(){
        System.out.println("initialDelay:"+new Date());
    }

    @Scheduled(cron = "0 * * * * ?")
    public void cron(){
        System.out.println("cron:"+new Date());
    }
}

代码解释:

  • 通过@Scheduled注解来标注一个定时任务,其中fixedDelay=1000表示在当前任务执行结束一秒后开启另一个任务,fixedRate=2000表示在当前任务开始执行2秒后开启另一个定时任务,initialDelay=1000则表示首次执行的延迟时间。
  • 在@Scheduled注解中可以使用cron表达式,cron = "0 * * * * ?"表示该定时任务每分钟执行一次。

(4)、启动项目

SpringBoot实现定时任务_第1张图片

Quartz

1、Quartz简介

Quartz是一个功能丰富的开源作业调度库,它由java写成,可以集成在任何java应用程序中,包括Java SE和Java EE等。使用Quartz可以创建简单或者复杂的执行计划,它支持数据库、集群、插件以及邮件,并且支持cron表达式,具有极高的灵活性。

2、整合SpringBoot

首先创建SpringBoot项目,添加Quartz依赖。代码如下:

		<!-- Quartz依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

然后创建2个Job,代码如下:

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

public class MySecondJob extends QuartzJobBean {

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("hello:"+name+":"+new Date());
    }
}

Job可以是一个普通的JavaBean,如果是普通的JavaBean,那么可以先添加@Component注解将之注册到Spring容器中。Job也可以继承抽象类QuartzJobBean,如继承QuartzJobBean,则需要实现该类中的executeInternal方法,该方法在任务被调度的时候使用。

接下来创建QuartzConfig对JobDetail和Trigger进行配置,代码如下:

@Configuration
public class QuartzConfig {
    
    @Bean
    MethodInvokingJobDetailFactoryBean jobDetail1(){
        MethodInvokingJobDetailFactoryBean bean=new MethodInvokingJobDetailFactoryBean();
        bean.setTargetBeanName("myFirstJob");
        bean.setTargetMethod("sayHello");
        return bean;
    }
    
    @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;
    }
    
    @Bean
    SimpleTriggerFactoryBean simpleTrigger(){
        SimpleTriggerFactoryBean bean=new SimpleTriggerFactoryBean();
        bean.setJobDetail(jobDetail1().getObject());
        bean.setRepeatCount(3);
        bean.setStartDelay(1000);
        bean.setRepeatInterval(2000);
        return bean;
    }
    
    @Bean
    CronTriggerFactoryBean cronTrigger(){
        CronTriggerFactoryBean bean=new CronTriggerFactoryBean();
        bean.setJobDetail(jobDetail2().getObject());
        bean.setCronExpression("* * * * * ?");
        return bean;
    }
    
    @Bean
    SchedulerFactoryBean schedulerFactoryBean(){
        SchedulerFactoryBean bean=new SchedulerFactoryBean();
        SimpleTrigger simpleTrigger=simpleTrigger().getObject();
        CronTrigger cronTrigger=cronTrigger().getObject();
        bean.setTriggers(simpleTrigger,cronTrigger);
        return bean;
    }
}

代码解释:

  • JobDetail的配置有两种方式:第一种方式通过MethodInvokingJobDetailFactoryBean类配置JobDetail,只需要指定Job的实例名和要调用的方法即可,注册这种方式无法在创建JobDetail时传递参数;第二种方式是通过JobDetailFactoryBean来实现的,这种方式只需要指定JobClass即可,然后可以通过JobDataMap传递参数到Job中,Job中只需要提供属性名,并且提供一个相应的set方法即可接收到参数。
  • Trigger有多种不同的实现,这里展示两种常用的Trigger:SimpleTrigger和CronTrigger,这两种Trigger分别使用SimpleTriggerFactoryBean和CronTriggerFactoryBean进行创建。
  • 在SimpleTriggerFactoryBean对象中,首先设置JobDetail,然后通过setRepeatCount配置任务循环次数,setStartDelay配置任务启动延迟时间,setRepeatInterval配置任务的时间间隔。在CronTriggerFactoryBean对象中,则主要配置JobDetail和Cron表达式。
  • 最后通过SchedulerFactoryBean创建SchedulerFactory,然后配置Trigger即可。

接下来启动Spring Boot项目:
SpringBoot实现定时任务_第2张图片

你可能感兴趣的:(Spring,Boot,基础,spring,java,spring,boot,quartz)