开启
定时任务import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
在定时任务方法上加上@Scheduled
注解
org.springframework.scheduling.annotation.Scheduled
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* 测试定时任务
*
* @author √Angelの爱灬
* @date 2020/3/13
*/
@Component
public class TestTask {
@Scheduled(cron="0 25 15 * * ? ")
public void testScheduledCron(){
// TODO: 执行定时任务
}
}
单个定时任务的弊端:不可以准确地控制定时
比如:我想在每天的凌晨1:30,上午8:40,中午12:00,晚上18:34执行一次,单个定时任务就实现不了了,只能 1:30、8:30、12:30、18:30执行
在定时任务方法上加上@Schedules
注解
org.springframework.scheduling.annotation.Schedules
@Schedules({
@Scheduled(cron="25 43 15 * * ? "),
@Scheduled(cron="10 43 15 * * ? "),
@Scheduled(cron="40 43 15 * * ? "),
})
public void execute(){
//do something
}
这样就可以非常准确地执行定时任务了
(1):cron:
[秒] [分] [小时] [日] [月] [周] [年]
@Scheduled(cron = "*/5 * * * * ?")
public void test(){}
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期六凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
通配符说明可以去查询相关资料
cron还支持占位符:
@Scheduled(cron = "${time.cron}")
public void test(){}
(2) fixedDelay:上一次执行完毕时间点之后多长时间再执行。
@Scheduled(fixedDelay = 5000) //上一次执行完毕时间点之后5秒再执行
public void test(){}
(3) fixedDelayString:与 fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。
@Scheduled(fixedDelayString = "5000") //上一次执行完毕时间点之后5秒再执行
public void test(){}
@Scheduled(fixedDelayString = "${time.fixedDelayString}") //上一次执行完毕时间点之后5秒再执行
public void test(){}
(4) fixedRate:上一次开始执行时间点之后多长时间再执行。
@Scheduled(fixedRate = 5000) //上一次开始执行时间点之后5秒再执行
public void test(){}
(5) fixedRateString:与 fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。
@Scheduled(fixedRateString = "${time.fixedRateString}") //上一次开始执行时间点之后5秒再执行
public void test(){}
(6) initialDelay:第一次延迟多长时间后再执行。
@Scheduled(initialDelay = 1000, fixedRate = 5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
public void test(){}
(6) initialDelayString:与 initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。
@Scheduled(initialDelayString = "${time.initialDelayString}", fixedRate = 5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
public void test(){}
@Scheduled总结
这里的动态配置不是动态配置定时任务执行时间,@Scheduled 定时的时间不能动态的改变
定时任务不再执行
,代码如下:配置前:nacos
test:
name: 张三
配置后:nacos
test:
name: 李四
java代码:
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* 测试定时任务
*
* @author √Angelの爱灬
* @date 2021/12/27
*/
@Component
@Data
@RefreshScope
public class TestTask {
@Value("${test.name}")
private String name;
@Scheduled(cron = "*/5 * * * * ?")
public void testScheduledCron(){
System.out.println("当前时间: " + System.currentTimeMillis());
System.out.println(name);
}
}
控制台输出:
经查阅,nacos中配置修改后,获取该配置的类变成了懒加载模式,即调用时才会加载,所以定时任务不再执行
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
/**
* 定时任务配置类
*
* @author √Angelの爱灬
* @date 2021/12/27
*/
@Data
@Component
@RefreshScope
public class TestTaskConfig {
@Value("${test.name:}")
private String name;
}
import com.shop.manager.task.TestTaskConfig;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 测试定时任务
*
* @author √Angelの爱灬
* @date 2021/12/27
*/
@Component
public class TestTask {
@Resource
private TestTaskConfig taskConfig;
@Scheduled(cron = "*/5 * * * * ?")
public void testScheduledCron(){
System.out.println("当前时间: " + System.currentTimeMillis());
System.out.println(taskConfig.getName());
}
}
这时再动态刷新配置中的值就可以正常的执行了