直接上代码很少说:java
由于空格会转码的因此web
访问 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*
访问spring
效果图apache
总体结构app
代码maven
logback-spring.xmlide
<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.txtspring-boot
${AnsiColor.BRIGHT_GREEN} _oo0oo_ 088888880 88" . "88 (| -_- |) 0\ = /0 ___/'---'\___ .' \\\\| |// '. / \\\\||| : |||// \\ /_ ||||| -:- |||||- \\ | | \\\\\\ - /// | | | \_| ''\---/'' |_/ | \ .-\__ '-' __/-. / ___'. .' /--.--\ '. .'___ ."" '< '.___\_<|>_/___.' >' "". | | : '- \'.;'\ _ /';.'/ - ' : | | \ \ '_. \_ __\ /__ _/ .-' / / ====='-.____'.___ \_____/___.-'____.-'===== '=---=' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 佛祖保佑 永不死机
pom.xmlui
<?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>
启动类url
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: 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 调用"); } }
写死的定时任务
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: 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*