0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何动态添加修改删除定时任务?

jf_78858299 来源:SpringBoot 作者:林祥纤 2023-04-12 11:06 次阅读

如何动态添加修改删除定时任务?那么我们一起看看具体怎么实现,先看下本节大纲:

(1)思路说明;

(2)代码解析;

(3)修改定时任务执行周期特别说明;

接下来看看本节的大纲:

(1)思路说明;

(a)首先这里我们需要重新认识一个类ThreadPoolTaskScheduler:线程池任务调度类,能够开启线程池进行任务调度。

(b)ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduledFuture,在这个方法需要添加两个参数,Runnable(线程接口类)和CronTrigger(定时任务触发器)

(c)在ScheduledFuture中有一个cancel可以停止定时任务。

(2)代码解析;

根据以上的思路分析,我们很容易就知道如何进行编码了,先提供代码如下:

package com.kfit.task;

import java.util.Date;

**import **java.util.concurrent.ScheduledFuture;

**import **org.springframework.beans.factory.annotation.Autowired;

**import **org.springframework.context.annotation.Bean;

importorg.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

**import **org.springframework.scheduling.support.CronTrigger;

**import **org.springframework.stereotype.Component;

**import **org.springframework.web.bind.annotation.RequestMapping;

**import **org.springframework.web.bind.annotation.RestController;

/**

  • @author Angel --守护天使
  • @version v.0.1
  • @date 2017年4月6日

*/

@RestController

@Component

**public **class DynamicTask {

@Autowired

**private** ThreadPoolTaskSchedulerthreadPoolTaskScheduler;



**private **ScheduledFuture? future;



@Bean

**public** ThreadPoolTaskSchedulerthreadPoolTaskScheduler() {

   **return****new**ThreadPoolTaskScheduler();

}



@RequestMapping("/startCron")

**public** String startCron() {

   future = threadPoolTaskScheduler.schedule(**new** MyRunnable(), **new** CronTrigger("0/5 * * * * *"));

   System. ***out*** .println("DynamicTask.startCron()");

    **return ** "startCron";

}



@RequestMapping("/stopCron")

**public** String stopCron() {

   **if** (future !=  **null** ) {

       future.cancel( **true** );

   }

   System. ***out*** .println("DynamicTask.stopCron()");

    **return ** "stopCron";

}



@RequestMapping("/changeCron10")

**public** String startCron10() {

   stopCron();// 先停止,在开启.

   future = threadPoolTaskScheduler.schedule(**new** MyRunnable(), **new** CronTrigger("*/10 * * * * *"));

   System. ***out*** .println("DynamicTask.startCron10()");

    **return ** "changeCron10";

}



**private ****class** MyRunnable **implements** Runnable {

   @Override

   **public ****void** run() {

       System. ***out*** .println("DynamicTask.MyRunnable.run()," + **new** Date());

   }

}

}

(a)我们首先了一个类DynamicTask;

(b)定义了两个变量,threadPoolTaskScheduler和future 其中future是treadPoolTaskScheduler执行方法schedule的返回值,主要用于定时任务的停止。

(c)编写启动定时器的方法startCron();

(d)编写停止方法stopCron(),这里编码的时候,需要注意下需要判断下future为null的时候,不然就很容易抛出NullPointerException;

(e)编写修改定时任务执行周期方法changeCron10(),这里的原理就是关闭之前的定时器,创新在创建一个新的定时器。

(3)修改定时任务执行周期特别说明;

在上一篇博客中,我们使用了一种方式通过全局变量的方式修改cron参数的值,那么在这里的我们也是可以这么做的,这里简单提供下思路,大家自己去实现。

注意ThreadPoolTaskScheduler中的schedule()第二个参数支持Trigger:

ThreadPoolTaskScheduler.schedule([Runnable]( "in java.lang") arg0, [Trigger]( "in org.springframework.scheduling")arg1)

那么我们就可以自己定义一个Trigger,然后动态进行修改了,这里提供核心的代码如下:

private String cronStr = "*/5 * * * * *";

@RequestMapping("/startCron1")

**public** String startCron1(){

    System. ***out*** .println("startCron1 >>>>");

    threadPoolTaskScheduler.schedule(**new** MyRunnable(), **new** Trigger(){

        @Override

        **public** DatenextExecutionTime(TriggerContext triggerContext){

            **return****new** CronTrigger(cronStr).nextExecutionTime(triggerContext);

        }

    });

    System. ***out*** .println("startCron1 <<<<");

     **return ** "startCron1";

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    103000
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66812
收藏 人收藏

    评论

    相关推荐

    Linux系统定时任务Crond

    会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作,如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作,这个crond定时任务服务就相当于我们平时早起使用的闹钟一
    发表于 07-05 06:22

    请问怎么批量修改删除相同元器件的名字?

    怎么批量的修改删除相同元器件的名字,比如电阻的RES2或者Headr 3H这个名字?
    发表于 09-29 05:20

    linux的循环定时任务

    linux循环定时任务
    发表于 05-20 14:59

    busybox用crontab/crond在嵌入式系统中添加定时任务的方法

    busybox 用crontab、crond在嵌入式系统中添加定时任务:参考文档:在嵌入式系统中,定时任务通过crond和cronttab两个系统命令来联合执行。其中crond是定时任务的守护进程
    发表于 12-14 06:40

    定时任务的发展史是怎么样的

    定时任务是互联网行业里最常用的服务之一,本文给大家介绍定时任务在我司的发展历程。 linux系统中一般使用crontab命令来实现,在Java世界里,使用最广泛的就是quartz
    发表于 07-18 17:38 0次下载
    <b class='flag-5'>定时任务</b>的发展史是怎么样的

    SpringBoot如何实现动态增删启停定时任务

    这两种方式不能动态添加删除、启动、停止任务。 要实现动态增删启停定时任务功能,比较广泛的做法是
    的头像 发表于 09-24 09:49 2601次阅读
    SpringBoot如何实现<b class='flag-5'>动态</b>增删启停<b class='flag-5'>定时任务</b>

    Python定时任务的实现方式

    在日常工作中,我们常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond 结合命令行实现。另外一种方式是直接使用Python。接下来整理的是常见的Python定时任务
    的头像 发表于 10-08 15:20 3226次阅读

    如何在SpringBoot项目中实现动态定时任务

    之前写过文章记录怎么在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,实在不太灵活。
    的头像 发表于 09-30 11:16 1494次阅读

    解析Golang定时任务库gron设计和原理

    正巧,最近看到了 gron 这个开源项目,它是用 Golang 实现一个并发安全的定时任务库。实现非常简单精巧,代码量也不多。今天我们就来一起结合源码看一下,怎样基于 Golang 的能力做出来一个【定时任务库】。
    的头像 发表于 12-15 13:57 948次阅读

    求一种SpringBoot定时任务动态管理通用解决方案

    SpringBoot的定时任务的加强工具,实现对SpringBoot原生的定时任务进行动态管理,完全兼容原生@Scheduled注解,无需对原本的定时任务进行
    的头像 发表于 02-03 09:49 551次阅读

    SpringBoot如何实现定时任务(下)

    SpringBoot创建定时任务的方式很简单,主要有两种方式:一、基于注解的方式(@Scheduled)二、数据库动态配置。实际开发中,第一种需要在代码中写死表达式,如果修改起来,又得重启会显得很麻烦;所以我们往往会采取第二种方
    的头像 发表于 04-07 14:51 1036次阅读
    SpringBoot如何实现<b class='flag-5'>定时任务</b>(下)

    SpringBoot如何实现定时任务(上)

    SpringBoot创建定时任务的方式很简单,主要有两种方式:一、基于注解的方式(@Scheduled)二、数据库动态配置。实际开发中,第一种需要在代码中写死表达式,如果修改起来,又得重启会显得很麻烦;所以我们往往会采取第二种方
    的头像 发表于 04-07 14:51 1030次阅读
    SpringBoot如何实现<b class='flag-5'>定时任务</b>(上)

    Spring Boot中整合两种定时任务的方法

    在 Spring + SpringMVC 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用第三方
    的头像 发表于 04-07 14:55 1243次阅读
    Spring Boot中整合两种<b class='flag-5'>定时任务</b>的方法

    在Spring Boot中如何使用定时任务

    本文介绍在 Spring Boot 中如何使用定时任务,使用非常简单,就不做过多说明了。
    的头像 发表于 04-12 10:56 782次阅读

    python定时任务实践

    由于程序需求,监测配置变化需要设置定时任务,每分钟执行一次,对任务持久化要求不高,不需要时可以关闭定时任务
    的头像 发表于 05-20 17:53 784次阅读
    python<b class='flag-5'>定时任务</b>实践