From e6d2883d9e9eef2844d468b6d4c2bfc54d79d873 Mon Sep 17 00:00:00 2001 From: caoshd Date: Mon, 4 Mar 2024 21:47:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=20=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 33 ++++++++++++ pom.xml | 51 +++++++++++++++++++ .../dyn_sch/DynamicScheduleApplication.java | 13 +++++ .../dyn_sch/schedule/DynamicSchedule.java | 41 +++++++++++++++ .../caoshd/dyn_sch/DemoApplicationTests.java | 47 +++++++++++++++++ 5 files changed, 185 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/space/caoshd/dyn_sch/DynamicScheduleApplication.java create mode 100644 src/main/java/space/caoshd/dyn_sch/schedule/DynamicSchedule.java create mode 100644 src/test/java/space/caoshd/dyn_sch/DemoApplicationTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..25d42c2 --- /dev/null +++ b/pom.xml @@ -0,0 +1,51 @@ + + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.7.7 + + + + space.caoshd + dynamic-schedule + 1.0.0-SNAPSHOT + + dynamic-schedule + + + 1.8 + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-test + test + + + org.projectlombok + lombok + provided + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/space/caoshd/dyn_sch/DynamicScheduleApplication.java b/src/main/java/space/caoshd/dyn_sch/DynamicScheduleApplication.java new file mode 100644 index 0000000..a1114cd --- /dev/null +++ b/src/main/java/space/caoshd/dyn_sch/DynamicScheduleApplication.java @@ -0,0 +1,13 @@ +package space.caoshd.dyn_sch; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@EnableScheduling +public class DynamicScheduleApplication { + public static void main(String[] args) { + SpringApplication.run(DynamicScheduleApplication.class, args); + } +} diff --git a/src/main/java/space/caoshd/dyn_sch/schedule/DynamicSchedule.java b/src/main/java/space/caoshd/dyn_sch/schedule/DynamicSchedule.java new file mode 100644 index 0000000..787ffb2 --- /dev/null +++ b/src/main/java/space/caoshd/dyn_sch/schedule/DynamicSchedule.java @@ -0,0 +1,41 @@ +package space.caoshd.dyn_sch.schedule; + + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.support.CronTrigger; +import org.springframework.scheduling.support.PeriodicTrigger; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +@Data +@Slf4j +@Component +public class DynamicSchedule implements SchedulingConfigurer { + + @Value("${app.schedule.cron: */1 * * * * ?}") + private String cron; + + @Value("${app.schedule.period: 1000}") + private Long period; + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + // 使用 cron 表达式 动态设置循环间隔 + taskRegistrar.addTriggerTask( + () -> log.info("current time trigger by cron : {}", LocalDateTime.now()), + context -> new CronTrigger(cron).nextExecutionTime(context) + ); + + // 使用 固定周期 动态设置循环间隔 + taskRegistrar.addTriggerTask( + () -> log.info("current time trigger by period: {}", LocalDateTime.now()), + context -> new PeriodicTrigger(period).nextExecutionTime(context) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/space/caoshd/dyn_sch/DemoApplicationTests.java b/src/test/java/space/caoshd/dyn_sch/DemoApplicationTests.java new file mode 100644 index 0000000..d0524cd --- /dev/null +++ b/src/test/java/space/caoshd/dyn_sch/DemoApplicationTests.java @@ -0,0 +1,47 @@ +package space.caoshd.dyn_sch; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import space.caoshd.dyn_sch.schedule.DynamicSchedule; + +import java.util.concurrent.TimeUnit; + +@SpringBootTest +@Slf4j +class DemoApplicationTests { + @Autowired + DynamicSchedule dynamicSchedule; + + @Test + public void updateCron() throws Exception { + // 先是每隔一秒执行一次 + TimeUnit.SECONDS.sleep(10); + + // 十秒钟后 更新 cron 配置 + String cron = "*/5 * * * * ?"; + log.info("update cron: {}", cron); + + dynamicSchedule.setCron(cron); + + // 20 秒后 程序关闭 + TimeUnit.SECONDS.sleep(20); + } + + @Test + public void updatePeriod() throws Exception { + // 先是每隔一秒执行一次 + TimeUnit.SECONDS.sleep(10); + + // 十秒钟后 更新 period 配置 + Long period = 5000L; + log.info("update period: {}", period); + + dynamicSchedule.setPeriod(period); + + // 20 秒后 程序关闭 + TimeUnit.SECONDS.sleep(20); + } + +}