springboot Scheduled url請求 動態配置定時時間
阿新 • • 發佈:2019-08-03
直接上程式碼不多說:
因為空格會轉碼的所以
訪問 http://localhost:8080/hello?task=0/10 * * * * *和
http://localhost:8080/hello?task=0/20 * * * * *會轉碼成
http://localhost:8080/hello?task=0/10%20*%20*%20*%20*%20*
http://localhost:8080/hello?task=0/20%20*%20*%20*%20*%20*
-
訪問
-
效果圖
-
整體結構
-
程式碼
-
logback-spring.xml
<configuration> <contextName>spring-boot-demo</contextName> <!--各專案日誌儲存統一父目錄->路徑自己設定絕對路徑和相對路徑都可以--> <property name="LOG_DIR" value="C:/TEMP"/> <!--最大儲存天數--> <property name="KEEP_MAX_DAY" value="180"/> <!--總最大儲存檔案大小--> <property name="KEEP_TOTAL_MAX_SIZE" value="5GB"/> <!--單檔案最大儲存檔案大小--> <property name="KEEP_FILE_MAX_SIZE" value="100MB"/> <!--輸出到控制檯--> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> </encoder> </appender> <!--輸出到ERROR事件記錄檔案--> <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <file>${LOG_DIR}/${CONTEXT_NAME}/error/${CONTEXT_NAME}-error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_DIR}/${CONTEXT_NAME}/error/${CONTEXT_NAME}-error-%d{yyyy-MM-dd}.%i.log.gz </fileNamePattern> <maxFileSize>${KEEP_FILE_MAX_SIZE}</maxFileSize> <maxHistory>${KEEP_MAX_DAY}</maxHistory> <totalSizeCap>${KEEP_TOTAL_MAX_SIZE}</totalSizeCap> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> </encoder> </appender> <!--輸出到WARN事件記錄檔案--> <appender name="warnFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <file>${LOG_DIR}/${CONTEXT_NAME}/warn/${CONTEXT_NAME}-warn.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_DIR}/${CONTEXT_NAME}/warn/${CONTEXT_NAME}-warn-%d{yyyy-MM-dd}.%i.log.gz </fileNamePattern> <maxFileSize>${KEEP_FILE_MAX_SIZE}</maxFileSize> <maxHistory>${KEEP_MAX_DAY}</maxHistory> <totalSizeCap>${KEEP_TOTAL_MAX_SIZE}</totalSizeCap> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> </encoder> </appender> <!--輸出到INFO事件記錄檔案--> <appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <file>${LOG_DIR}/${CONTEXT_NAME}/info/${CONTEXT_NAME}-info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_DIR}/${CONTEXT_NAME}/info/${CONTEXT_NAME}-info-%d{yyyy-MM-dd}.%i.log.gz </fileNamePattern> <maxFileSize>${KEEP_FILE_MAX_SIZE}</maxFileSize> <maxHistory>${KEEP_MAX_DAY}</maxHistory> <totalSizeCap>${KEEP_TOTAL_MAX_SIZE}</totalSizeCap> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> </encoder> </appender> <logger name="org.springframework.jdbc.core" level="debug" additivity="false"> <appender-ref ref="console"/> </logger> <logger name="top.hh.scheduling.web" level="debug" additivity="false"> <appender-ref ref="console"/> </logger> <root level="info"> <appender-ref ref="console"/> <appender-ref ref="errorFile"/> <appender-ref ref="warnFile"/> <appender-ref ref="infoFile"/> </root> </configuration>
-
banner.txt
${AnsiColor.BRIGHT_GREEN} _oo0oo_ 088888880 88" . "88 (| -_- |) 0\ = /0 ___/'---'\___ .' \\\\| |// '. / \\\\||| : |||// \\ /_ ||||| -:- |||||- \\ | | \\\\\\ - /// | | | \_| ''\---/'' |_/ | \ .-\__ '-' __/-. / ___'. .' /--.--\ '. .'___ ."" '< '.___\_<|>_/___.' >' "". | | : '- \'.;'\ _ /';.'/ - ' : | | \ \ '_. \_ __\ /__ _/ .-' / / ====='-.____'.___ \_____/___.-'____.-'===== '=---=' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 佛祖保佑 永不宕機
-
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.test</groupId> <artifactId>Scheduled</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Scheduled</name> <description>Scheduled project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <!--<scope>test</scope>--> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
啟動類
package top.hh.scheduling; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.Banner; import org.springframework.boot.SpringBootVersion; import org.springframework.boot.ansi.AnsiOutput; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class App { private static final Logger LOG = LoggerFactory.getLogger(App.class); public static void main(String[] args) { // new SpringApplication(QuartzApp.class).run(args); AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS); new SpringApplicationBuilder(App.class)// .main(SpringBootVersion.class) // 這個是為了可以載入 SpringBoot 版本 .bannerMode(Banner.Mode.CONSOLE)// 控制檯列印 .run(args); LOG.info("App 啟動..."); } }
-
controller
package top.hh.scheduling.web; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import top.hh.scheduling.springscheduled.TaskCronChange; /** * description: * * @author: dawn.he QQ: 905845006 * @email: [email protected] * @email: [email protected] * @date: 2019/7/30 10:52 AM */ @RestController @RequestMapping public class TaskController { private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(TaskController.class); @RequestMapping("/hello") public void hello(String task) { System.out.println(task); if (task.equals("")) { task = "0/10 * * * * *"; } TaskCronChange.cron = task; LOG.info("web:hello 呼叫"); } }
-
寫死的定時任務
package top.hh.scheduling.springscheduled; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import java.time.LocalDateTime; @Configuration //1.主要用於標記配置類,兼備Component的效果。 @EnableScheduling // 2.開啟定時任務 public class SaticScheduleTask { //3.新增定時任務 // @Scheduled(cron = "0/5 * * * * ?") //或直接指定時間間隔,例如:5秒 //@Scheduled(fixedRate=5000) public void configureTasks() { System.err.println("執行靜態定時任務時間: " + LocalDateTime.now()); } }
-
動態修改的定時任務(可通過訪問url動態修改定時任務)
package top.hh.scheduling.springscheduled; /** * description: 定時任務動態修改cron引數 * * @author: dawn.he QQ: 905845006 * @email: [email protected] * @email: [email protected] * @date: 2019/7/30 11:18 AM */ import java.util.Date; import org.slf4j.LoggerFactory; 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; @Component @EnableScheduling public class TaskCronChange implements SchedulingConfigurer { private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(TaskCronChange.class); public static String cron; public TaskCronChange() { //預設情況是:每5秒執行一次. cron = "0/5 * * * * *"; // new Thread(new Runnable() { // // // // // 開啟新執行緒模擬外部更改了任務執行週期. // // @Override // // public void run() { // // try { // // // 讓執行緒睡眠 15秒. // // Thread.sleep(15000); // // } catch (InterruptedException e) { // // e.printStackTrace(); // // } // // //修改為:每10秒執行一次. // // cron = "0/10 * * * * *"; // // System.err.println("cron change to:"+cron); // // } // // }).start();; } @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { Runnable task = new Runnable() { @Override public void run() { //任務邏輯程式碼部分. // System.out.println(); LOG.info("TaskCronChange task is running ... " + new Date()); } }; Trigger trigger = new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { //任務觸發,可修改任務的執行週期. CronTrigger trigger = new CronTrigger(cron); Date nextExec = trigger.nextExecutionTime(triggerContext); return nextExec; } }; taskRegistrar.addTriggerTask(task, trigger); } }
-