1. 程式人生 > >springboot Scheduled url請求 動態配置定時時間

springboot Scheduled url請求 動態配置定時時間

直接上程式碼不多說:

因為空格會轉碼的所以

	訪問 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*
  1. 訪問

  2. 效果圖

  3. 整體結構

  4. 程式碼

    1. 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>
      
    2. banner.txt

      	${AnsiColor.BRIGHT_GREEN}
                                _oo0oo_
                               088888880
                               88" . "88
                               (| -_- |)
                                0\ = /0
                             ___/'---'\___
                           .' \\\\|     |// '.
                          / \\\\|||  :  |||// \\
                         /_ ||||| -:- |||||- \\
                        |   | \\\\\\  -  /// |   |
                        | \_|  ''\---/''  |_/ |
                        \  .-\__  '-'  __/-.  /
                      ___'. .'  /--.--\  '. .'___
                   ."" '<  '.___\_<|>_/___.' >'  "".
                  | | : '-  \'.;'\ _ /';.'/ - ' : | |
                  \  \ '_.   \_ __\ /__ _/   .-' /  /
              ====='-.____'.___ \_____/___.-'____.-'=====
                                '=---='
      
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      佛祖保佑            永不宕機
      
      
    3. 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>
      
      
      
    4. 啟動類

      	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 啟動...");
      		}
      
      	}
      
      
    5. 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 呼叫");
      		}
      
      	}
      
      
    6. 寫死的定時任務

      	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());
      		}
      
      	}
      
    7. 動態修改的定時任務(可通過訪問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);
      
      		}
      
      
      	}
      
      

訪問:http://localhost:8080/hello?task=0/10%20