• SpringBoot入门 (十二) 定时任务


    本文记录在SpringBoot中使用定时任务。

      在我们的项目中,经常需要用到定时任务去帮我们做一些事情,比如服务状态监控,业务数据状态的更改等,SpringBoot中实现定时任务有2中方案,一种是自带的,我们只需要加上注解即可;另一种是集成Quartz来实现定时任务。

    一 SpringBoot 提供的定时任务

      在SpringBoot的starter包中已经提供了对定时任务的支持,我们很容易实现定时任务。修改pom.xml文件,加入如下内容,引入依赖:

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

      在启动类上加注@EnableScheduling 注解,开启定时任务

    @SpringBootApplication
    @EnableScheduling
    public class TimingTaskApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(TimingTaskApplication.class, args);
        }
    
    }
    

      创建定时任务类及要定时执行的方法

    @Component
    public class ScheduleTaskDemo {
    
        private int num1 = 0;
        private DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
        @Scheduled(cron = "*/5 * * * * ?")
        public void test1(){
            System.out.println("这是test1方法第"+ (++num1) + "次执行,执行时间:"+df.format(new Date()));
        }
    
    }
    

      @Component 注解 将当前类交给Spring容器管理

      @Scheduled 注解标明方法是一个定时执行的方法

      启动项目后可以看到控制台打印出的信息

      @Scheduled 注解有几个参数可以使用,每个参数的意义不一样,参数及执行规则说明如下:

      fixedRate @Scheduled(fixedRate = 5000) 上一次开始执行时间点之后每5秒执行一次;

      fixedDelay @Scheduled(fixedDelay = 5) 上一次执行完毕时间点之后每5秒执行一次;

      initialDelay @Scheduled(initialDelay = 1, fixedDelay = 6) 第一次延迟1秒后执行,之后按照fixedRate的规则执行;

      cron @Scheduled(cron = "*/5 * * * * ?") 一个表达式,一共有7位,一般只需要设置6为就可以了

      第一位:秒,取值范围是0-59;

      第二位:分,取值范围是0-59;

      第三位:时,取值范围0-23;

      第四位:日,取值范围1-31;

      第五位:月,取值范围1-12;

      第六位:星期,取值范围1-7,1代表星期日,2代表星期一,7代表星期六;

      第七位:年,取值范围1970-099,可以不设置。

      cron表达式也可以在http://cron.qqe2.com进行在线生成。

     二 SpringBoot集成Quartz

         Quartz是用Java编写的一个开源的任务调度框架。提供了丰富的Api供调用,支持集群环境和持久化,支持多种配置,与SpringBoot可以无缝集成。

      Quartz几个关键元素:

      Job  代表要执行的任务,是个接口,提供了一个方法 execute(JobExecutionContext context);

      JobDetail  代表具体的要执行的任务;

      Trigger  代表调度任务的触发器,配置调度任务的执行规则;

      Scheduler  代表调度容器,一个调度容器中可以注册多个JobDetail和Trigger。

      元素关系如下图:

      SpringBoot对Quartz已经提供了支持,我们可以很容易的使用,在pom.xml文件中引入依赖

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-quartz</artifactId>
            </dependency>
    

      在启动类上加注解 @EnableScheduling ,开启定时执行。

      创建一个要执行的任务继承QuartzJobBean,输出任务执行时间

    public class MyTask1 extends QuartzJobBean {
    
        private DateFormat df = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
    
        @Override
        protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            System.out.println("MyTask1 执行时间:" + df.format(new Date()));
        }
    
    }
    

      创建一个配置类,初始化MyTask1任务所需要的JobDetail和Trigger

    @SpringBootConfiguration
    public class QuartzConfig {
    
        @Bean
        public JobDetail myTask1JobDetail(){
            return JobBuilder.newJob(MyTask1.class).withIdentity("myTask1").storeDurably().build();
        }
    
        @Bean
        public Trigger myTask1Trigger(){
            SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                    //5秒执行一次
                    .withIntervalInSeconds(5)
                    .repeatForever();
            SimpleTrigger trigger = TriggerBuilder.newTrigger()
                    //指定触发器对应的JobDetail
                    .forJob(myTask1JobDetail())
                    .withIdentity("myTask1")
                    .withSchedule(scheduleBuilder).build();
            return trigger;
        }
    
    }
    

      启动项目,可以看到控制台输出的内容

        在上边的方法,我们使用的定时执行方法是在代码中写的固定值,这种局限性比较大,难以满足一些复杂的定制任务执行时间。我们使用Cron表达式来完成定时任务执行时间配置。

      创建任务类,继承QuartzJobBean

    public class MyTask2 extends QuartzJobBean {
    
        private DateFormat df = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
    
        @Override
        protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            System.out.println("MyTask2 执行时间:" + df.format(new Date()));
        }
    
    }
    

      在配置类QuartzConfig中创建任务所需的JobDetail和Trigger

    @Bean
        public JobDetail myTask2JobDetail(){
            return JobBuilder.newJob(MyTask2.class).withIdentity("myTask2").storeDurably().build();
        }
    
        @Bean
        public Trigger myTask2Trigger(){
            //cron 表达式
            String cronStr = "*/10 * * * * ?";
            //根据表达式设置ScheduleBuilder
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronStr);
            CronTrigger trigger = TriggerBuilder.newTrigger()
                    //指定JobDetail
                    .forJob(myTask2JobDetail())
                    .withIdentity("myTask2")
                    //指定ScheduleBuilder
                    .withSchedule(cronScheduleBuilder)
                    .build();
            return trigger;
        }
    

      重启项目,看到控制台输出内容,任务1每5秒执行一次,任务2每10秒执行一次

     

  • 相关阅读:
    s检验|k-S检验|适应性检验|独立性检验|Cintinuity correction |Fisher‘s Exact Test|Likelihood Ratio|Person Chi-Square|φ系数|Cramer’s V|列联系数
    方差分析||MSA/MSE|
    专利|Pct||
    会议信息|CNKI|AIAA|万方|AIP|CNKI|EI|CPCI|BP|INSPEC
    switch break, or no break
    Defining the Encoding
    Python is becoming the world’s most popular coding language
    用C与Python计算1! + 2! + 3! + ... +100!的值
    素数判断
    Richard Stallman's quest for creating a complete Unix-compatible software system called GNU (for Gnu's Not Unix)
  • 原文地址:https://www.cnblogs.com/love-wzy/p/10365521.html
Copyright © 2020-2023  润新知