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: dawn.he@cloudwise.com
      	 * @email: 905845006@qq.com
      	 * @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: dawn.he@cloudwise.com
      	 * @email: 905845006@qq.com
      	 * @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*%20*%20*%20*%20*

转载于:https://my.oschina.net/u/3730149/blog/3081066

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值