需求缘起:在发布了《Spring Boot定时任务升级篇》之后得到不少反馈,其中有一个反馈就是如何动态修改cron参数呢?那么我们一起看看具体怎么实现,先看下本节大纲:
(2)动态修改定时任务的执行周期;
接下来看下本节的具体内容:
(1)简单方式:修改定时任务的执行周期;
按正常来讲,修改定时任务的执行周期,把服务停下来,改下任务的cron参数,再重启服务就搞搞定了。这种方式很简单,没有可说的,但是有没有一种可能,在不停服务的情况下,就可以动态的修改任务的cron参数呢?哈哈,那是必须的必。
(2)动态修改定时任务的执行周期;
首先我们先会回顾下,我们之前是使用了@Scheduled(cron =“0/5 * * * * *”)这种方式适用于固定任务周期的任务,若要修改任务执行周期,只能走“停服务—修改任务执行周期—重启服务”这条路。那么如何动态修改呢,我们看下步骤:
② 设置一个静态的cron,用于存放任务执行周期参数。
③ 开启一个线程,用于模拟实际业务中外部原因修改了任务执行周期。
④ 设置任务触发器,触发任务执行。
具体的代码如下:
package com.kfit.task;
import java.util.Date;
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;
/**
* Spring @Scheduled定时任务动态修改cron参数
* @author Angel --守护天使
* @version v.0.1
* @date 2017年4月6日
*/
@Component
@EnableScheduling
public class TaskCronChange implements SchedulingConfigurer{
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("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);
}
}
这里核心的主要是使用到了ScheduledTaskRegistrar这个类有一个方法addTriggerTask(Runnable,Trigger) 两个参数,一个Runnable,一个是Trigger,在Runnable中执行业务逻辑代码,在Trigger修改定时任务的执行周期。
启动查看控制台的打印信息如下:
TaskCronChange task is running ... Thu Apr 06 05:38:20 CST 2017
TaskCronChange task is running ... Thu Apr 06 05:38:25 CST 2017
TaskCronChange task is running ... Thu Apr 06 05:38:30 CST 2017
cron change to:0/10 * * * * *
TaskCronChange task is running ... Thu Apr 06 05:38:35 CST 2017
TaskCronChange task is running ... Thu Apr 06 05:38:40 CST 2017
TaskCronChange task is running ... Thu Apr 06 05:38:50 CST 2017
下篇博客【Spring Boot 定时任务升级篇(动态添加修改删除定时任务)】
à悟空学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
Spring Cloud视频:http://t.cn/A6ZagxSR
SpringBoot Shiro视频:http://t.cn/A6Zag7IV
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringData和JPA视频:http://t.cn/A6Zad1OH
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
Sharding-JDBC分库分表实战:http://t.cn/A6ZarrqS
分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr
相关推荐
Spring boot开启定时任务的三种方式 零、前言 第一种也就是最简单的一种:基于注解 (@Scheduled)的方式; 第二种:基于接口 (SchedulingConfigurer); 第三种:基于注解设定多线程定时任务。 一、基于@Scheduled注解...
Springboot整合Quartz实现定时任务数据库动态配置,新增任务、修改cron表达式、暂停任务、恢复任务、删除任务等操作
通过本文,读者将能够了解如何在Spring Boot应用中轻松创建和管理定时任务。 # @Scheduled注解简介 在Spring框架中,@Scheduled注解用于标记一个方法,使其能够在固定的时间间隔内自动执行。这个注解主要基于Java的...
spring boot @scheduled注解 cron 表达式实现计划任务调度。
本篇文章中主要介绍了Spring Boot中使用@Scheduled创建定时任务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
k8s+springboot+cronjob 定时任务配置
主要给大家介绍了关于利用Spring Boot实现简单的定时任务的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
基于Spring Boot的权限后台管理系统新增功能:1.cron表达式转换器:通过前端界面自动生成cron表达式,方便我们后续创建定时任务时所需要添加的执行时间2.定时任务:开启了多端口多线程执行的定时任务可以执行停止...
JTimer for JAVA是基于SpringBoot+layui秒级定时任务管理,取代crontab。其PHP版本 https ://gitee.com/itzhoujun/JTimer,基于thinkphp5+layui秒级定时任务管理,任务进程使用master-worker模型,无阻塞执行任务,...
主要介绍了springboot schedule 解决定时任务不执行的问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
强自定义:支持在线配置定时任务请求类型、请求路径、请求参数、Cron表达式,即时生效; 动态控制:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效; 执行策略:支持丰富的执行策略,包括:Get...
7. 强自定义:支持在线配置定时任务请求类型、请求路径、请求参数、Cron表达式,即时生效; 8. 动态控制:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效; 9. 执行策略:支持丰富的执行策略,...
主要介绍了springboot实现多实例crontab抢占定时任务,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
主要介绍了SpringBoot 定时任务遇到的坑,今天踩的这个坑和 cron 表达式有关,文中给大家介绍了cron 表达式的解释,需要的朋友一起看看吧
基于Spring Boot实现的modbus定时tcp通信,支持线程池,可从数据库动态设置ip,端口号及执行周期(执行周期需遵循cron表达) 本项目使用Spring Data Jpa + MySQL,具体依赖见pom.xml modbus协议基于jlibmodbus实现...
boot类型的java项目的cron类型的定时任务进行集中管理,实现分布式的任务调度,任务自动发现,任务执行状态可视化查看等功能。 任务调度系统主要功能有: 任务管理和查看。提供任务调度管理后台,可以可视化管理(增...
springboot整合quartz完整项目,采用cron类型表达式,可动态添加修改删除定时任务,保证真实可用!可自己扩展
程序在运行的时候为了了解运行状态,会输出日志文件,时间久了日志文件会变得...logrotate由系统的cron运行,位置在/etc/cron.daily/logrotate #!/bin/sh /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status
16、定时任务:定时任务的维护,通过cron表达式控制任务的执行频率。17、系统配置:系统运行的参数的维护,参数的配置与系统运行机制息息相关。18、邮件发送:发送邮件功能。19、短信发送:短信发送功能,可使用阿里...