如何动态修改cron参数呢?

电子说

1.3w人已加入

描述

如何动态修改cron参数呢?那么我们一起看看具体怎么实现,先看下本节大纲:

(1)简单方式:修改定时任务的执行周期;

(2)动态修改定时任务的执行周期;

接下来看下本节的具体内容:

(1)简单方式:修改定时任务的执行周期;

按正常来讲,修改定时任务的执行周期,把服务停下来,改下任务的cron参数,再重启服务就搞搞定了。这种方式很简单,没有可说的,但是有没有一种可能,在不停服务的情况下,就可以动态的修改任务的cron参数呢?哈哈,那是必须的必。

(2)动态修改定时任务的执行周期;

首先我们先会回顾下,我们之前是使用了@Scheduled(cron =“0/5 * * * * *”)这种方式适用于固定任务周期的任务,若要修改任务执行周期,只能走“停服务—修改任务执行周期—重启服务”这条路。那么如何动态修改呢,我们看下步骤:

① 在定时任务类上增加@EnabledScheduling注解,并实现SchedulingConfigurer接口。

② 设置一个静态的cron,用于存放任务执行周期参数。

③ 开启一个线程,用于模拟实际业务中外部原因修改了任务执行周期。

④ 设置任务触发器,触发任务执行。

具体的代码如下:

package com.kfit.task;

import java.util.Date;

import org.springframework.scheduling.Trigger;

import org.springframework.scheduling.TriggerContext;

importorg.springframework.scheduling.annotation.EnableScheduling;

importorg.springframework.scheduling.annotation.SchedulingConfigurer;

importorg.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("TaskCronChangetask 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 0605:38:20 CST 2017

TaskCronChangetask is running ... Thu Apr 06 05:38:25CST 2017

TaskCronChangetask is running ... Thu Apr 06 05:38:30CST 2017

cronchange to:0/10 * * * * *

TaskCronChangetask is running ... Thu Apr 06 05:38:35CST 2017

TaskCronChangetask is running ... Thu Apr 06 05:38:40CST 2017

TaskCronChangetask is running ... Thu Apr 06 05:38:50CST 2017

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分