SpringBoot企业开发: 定时任务

定时任务:

cron类似于linux的cron,比如部署代码到阿里云,实现什么定时发送天气预报邮件等等,再比如配置微信公众号助手,每天定时发送消息

常用于定时统计数目、数据库备份定时、定时发送短信邮件等。

分类: 

  • 简单的定时任务:@Scheduled注解
  • 复杂的定时任务: Quartz

简单的定时任务:@Scheduled注解

@Scheduled是由Spring提供的定时任务注解。

1.添加依赖:添加web依赖即可

2.开启定时任务:

启动类上添加@enableScheduling开启定时任务:

3.配置定时任务:通过@Scheduled

package com.yinlei.timedtask;

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

import java.util.Date;

@Component
public class MySchedule {
    /**
     * fixedDelay=1000表示再当前任务执行结束1秒后开启另一个任务
     */
    @Scheduled(fixedDelay = 1000)
    public void fixedDelay(){
        System.out.println("fixedDelay:"+new Date());
    }
    /**
     * fixedRate=2000表示再当前任务执行执行2秒后开启另一个定时任务
     */
    @Scheduled(fixedRate = 2000)
    public void fixedRate(){
        System.out.println("fixedRate:"+new Date());
    }

    /**
     * initialDelayv爱哦是首次执行的延迟时间
     */
    @Scheduled(initialDelay = 1000,fixedRate = 2000)
    public void initialDelay(){
        System.out.println("initialDelay:"+new Date());
    }

    /**
     * 添加cron表达式,具体可参考我的另一篇linux的cron的表达式的介绍
     */
    @Scheduled(cron = "0 * * * * ?")
    public void cron(){
        System.out.println("cron:"+new Date());
    }
}

 

 


 复杂的定时任务:Quartz

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

SpringBoot提供了3个Bean: JobDetail Trigger SchedulerFactory

1. 添加依赖:

2.创建2个job:

job可以是一个普通的JavaBean,如果是普通的JavaBean,可以先添加@Component注解将之注册到Spring容器中。Job可以继承抽象类QuartzJobBean,若继承自QuartzJobBean,则需要实现该类的executeInternal(),该方法在任务被调用时使用。接下来创建QuartzConfig对JobDetail和Trigger进行配置。

package com.yinlei.timedtask;

import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.SchedulerFactory;
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 {
    @Bean
    MethodInvokingJobDetailFactoryBean jobDetail(){
        MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
        bean.setTargetBeanName("myFirstJob");
        bean.setTargetMethod("sayHello");
        return bean;
    }
    
    @Bean
    JobDetailFactoryBean jobDetai2(){
        JobDetailFactoryBean bean = new JobDetailFactoryBean();
        bean.setJobClass(MySecondJob.class);
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("name","yinlei");
        bean.setJobDataMap(jobDataMap);
        bean.setDurability(true);
        return bean;
    }
    
    @Bean
    SimpleTriggerFactoryBean simpleTrigger(){
        SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();
        bean.setJobDetail(jobDetail().getObject());
        bean.setRepeatCount(3);
        bean.setStartDelay(1000);
        bean.setRepeatInterval(2000);
        return  bean;
    }
    
    @Bean
    CronTriggerFactoryBean cronTrigger(){
        CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
        bean.setJobDetail(jobDetai2().getObject());
        bean.setCronExpression("* * * * * ?");
        return bean;
    }
    
    @Bean
    SchedulerFactoryBean schedulerFactory(){
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        SimpleTrigger simpleTrigger = simpleTrigger().getObject();
        CronTrigger cronTrigger = cronTrigger().getObject();
        bean.setTriggers(simpleTrigger,cronTrigger);
        return bean;
    }
    
}

JobDetail的配置有2种方式:

  1. 通过MethodInvokingJobDetailFactoryBean类配置JobDetail。只需要指定job实例名和要调用的方法。注册这种方式无法在创建JobDetail时传递参数。
  2. 通过JobDetailFactoryBean来实现,只需要指定JobClass。然后可以通过JobDataMap传递参数到Job中,Job只需要提供属性名,提供一个相应的set方法即可接收到参数。

Trigger有多种实现,这里是常用的Trigger:SimpleTrigger和CronTrigger。

2个Trigger分别使用SimpleTriggerFactoryBean和CronTriggerFactoryBean进行创建。

在SImpleTriggerFactoryBean对象中,首先设置JobDetail,通过setRepeatCount配置任务的循环次数,

setDelay配置任务启动延迟时间,

setRepeatInterval配置任务的时间间隔。

CronTriggerFactoryBean中,主要配置JobDetail和Cron表达式

"然后通过SchedulerFactoryBean创建SchedulerFacotry,最后配置Trigger。

效果:MyFisrtJob重复3次就不执行,MySecond每秒执行1次,一直执行下去。

发布了356 篇原创文章 · 获赞 67 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_39969226/article/details/105007438