spring boot(5)定时调用

时间:2022-04-21 21:26:12

spring boot(5)定时调用

 

1.直接设置参数在方法名上面

MyTask.java

package com.guilf.task;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import java.util.Date;

/**
 * 自定义任务类.
 * 
 */
@Configuration
@EnableScheduling
public class MyTask {

    /**
     * @Scheduled 详细参数说明:
     *
     * 1.corn    指定:秒,分钟,小时,日期,月份,星期,年(可选)
     * 2.fixedDelay   从上一个任务完成到下一个任务开始的间隔,单位是毫秒
     * 3.fixedDelayString  同上,只是字符串类型.
     * 4.fixedRate    从上一个任务开始到下一个任务开始的间隔,单位是毫秒
     * 5.fixedRateString  同上,只是字符串类型.
     * 6.initialDelay   任务第一次执行前需要延迟的毫秒数
     * 7.initialDelayString   同上,只是字符串类型.
     * 8.zone    指定时区
     *
     */


    /**
     * 这个方法每10秒打印一次.
     * 使用cron表达式 指定:秒,分钟,小时,日期,月份,星期,年(可选).
     */
     @Scheduled(cron = "0/10 * * * * *")
     public void test() {
        System.out.println("test1......" + new Date().getTime());
     }


    /**
     * 每隔6秒执行.
     */
//    @Scheduled(fixedDelay = 6000)
//    public void test2() {
//        System.out.println("test2..." + new Date().getTime());
//    }

//    @Scheduled(fixedDelayString = "5000")
//    public void test3(){
//        System.out.println("test3..."+new Date().getTime());
//    }

}

  2.把参数设在文件里面

2.1 设置方法

/**
     * 使用外部的cron 表达式.
     */
    @Scheduled(cron = "${my.cron}")
    public void test4() {
        System.out.println("test4..." + new Date().getTime());
    }

2.2 设置参数

application.yml

##CRON表达式 含义
#    "0 0 12 * * ?"      每天中午十二点触发
#    "0 15 10 ? * *"    每天早上10:15触发
#    "0 15 10 * * ?"    每天早上10:15触发
#    "0 15 10 * * ? *"   每天早上10:15触发
#    "0 15 10 * * ? 2005"    2005年的每天早上10:15触发
#    “0 * 14 * * ?"    每天从下午2点开始到2点59分每分钟一次触发
 #   "0 0/5 14 * * ?"    每天从下午2点开始到2:55分结束每5分钟一次触发
 #   "0 0/5 14,18 * * ?"     每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发
 ##   "0 0-5 14 * * ?"    每天14:00至14:05每分钟一次触发
 #   "0 10,44 14 ? 3 WED"    三月的每周三的14:10和14:44触发
 #   "0 15 10 ? * MON-FRI"   每个周一、周二、周三、周四、周五的10:15触发

my:
  cron: '0/5 * * * * ?'

 3.DynamicTask.java

package com.guilf.task;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 动态修改定时任务.
 * Created by hong on 2017/6/30.
 */
@Component
@EnableScheduling
public class DynamicTask implements SchedulingConfigurer {
    /**
     * ① 在定时任务类上增加@EnabledScheduling注解,并实现SchedulingConfigurer接口。
     * ② 设置一个静态的cron,用于存放任务执行周期参数。
     * ③ 开启一个线程,用于模拟实际业务中外部原因修改了任务执行周期。
     * ④ 设置任务触发器,触发任务执行。
     */

    /**
     * 默认cron参数.
     */
    private static final String DEFAULT_CRON = "0/5 * * * * ?";

    /**
     * 动态修改的cron参数.
     */
    private String cron = DEFAULT_CRON;

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(
                new Runnable() {
                    //设置定时任务执行点.
                    @Override
                    public void run() {
                        System.out.println("定时执行的任务." + new Date().getTime());
                    }
                },
                // 设置定时任务.
                new Trigger() {
                    @Override
                    public Date nextExecutionTime(TriggerContext triggerContext) {
                        // 定时任务触发,可修改定时任务的执行周期
                        CronTrigger trigger = new CronTrigger(cron);
                        Date nextExecDate = trigger.nextExecutionTime(triggerContext);
                        return nextExecDate;
                    }
                });
    }

    public void setCron(String cron) {
        this.cron = cron;
    }

}

  DynamicTaskController.java

package com.guilf.mvc;

import com.guilf.task.DynamicTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 
 */
@RestController
public class DynamicTaskController {

    @Autowired
    private DynamicTask dynamicTask;

    private static final String DEFAULT_CRON = "0/10 * * * * ?";

    /**
     * 动态修改定时任务.
     * @return
     */
    @GetMapping("/dynamicTask")
    public String dynamicTask(){
        dynamicTask.setCron(DEFAULT_CRON);
        return DEFAULT_CRON;
    }
}

  spring boot(5)定时调用