Spring Scheduler动态更改cron表达式 [英] Spring Scheduler change cron expression dynamically

查看:362
本文介绍了Spring Scheduler动态更改cron表达式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以在applicationContext.xml中创建taskScheduler,并根据 cron 属性定期触发我的作业。

I am able to create a taskScheduler in applicationContext.xml, and my job is triggered periodically based on the cron attribute.

我想在调度程序启动后更改此 cron 表达式(触发周期),我的意思是在JavaEE应用程序运行时。

I would like to change this cron expression(triggering period) after scheduler start, I mean while JavaEE application is running.

使用Spring 3.XX

using Spring 3.XX

推荐答案

实际上我遇到了同样的问题

Actually I've faced same issue

我假设您需要从用户那里获得日期(1-31),时间,星期几,调度程序类型(每日,每月,每周)。

I am assuming you will need to get date(1-31) , time, day of week ,type of scheduler (Daily , monthly , weeekly ) from user.

首先,你需要从用户
的给定日期时间创建cron表达式。下面的代码将创建cron表达式,它接受一个map并将cron表达式作为字符串返回。

First, you need to create cron expression from the given date time from user Following code will create cron expression it takes an map and return cron expression as string.

public String  getCronExp(final Map<String, Object> configMap) {

    LOGGER.debug(">>  getCronExp");

    String exp = "";

    final String type = (String) configMap.get(SCHEDULER_TYPE);
    final String time = (String) configMap.get(TIME);
    final String[] split = time.split(this.COLON);
    String hour = split[0];
    String min = split[1];

    if ("00".equalsIgnoreCase(min)) {
        min = ZERO;
    }
    if ("00".equalsIgnoreCase(hour)) {
        hour = "0";
    }
    if ("daily".equalsIgnoreCase(type)) {

        exp = this.ZERO + this.WHITE_SPACE + min + this.WHITE_SPACE + hour + this.WHITE_SPACE + this.ASTERISK + this.WHITE_SPACE + this.ASTERISK
                + this.WHITE_SPACE + "?";

    } else if ("monthly".equalsIgnoreCase(type)) {
        final String date = (String) configMap.get(START_DATE);
        exp = this.ZERO + this.WHITE_SPACE + min + this.WHITE_SPACE + hour + this.WHITE_SPACE + date + this.WHITE_SPACE + this.ASTERISK + this.WHITE_SPACE
                + "?";

    } else if ("weekly".equalsIgnoreCase(type)) {

        final String dayOfWeek = (String) configMap.get(DAY_OF_WEEK);

        exp = this.ZERO + this.WHITE_SPACE + min + this.WHITE_SPACE + hour + this.WHITE_SPACE + "?" + this.WHITE_SPACE + this.ASTERISK + this.WHITE_SPACE
                + dayOfWeek;
    }

    LOGGER.info("Latest cron  expression scheduler " + exp);
    LOGGER.debug("<<  getCronExp");
    return exp;
}

在我们得到cron表达式后,我们遇到触发调度程序的问题。

After we get cron expression we have issue of triggering the scheduler.

创建一个扩展runnable的类:

Create a class that extends runnable:

public  class Scheduler implements Runnable {

@SuppressWarnings("rawtypes")
ScheduledFuture scheduledFuture;

TaskScheduler taskScheduler ;

//this method will kill previous scheduler if exists and will create a new scheduler with given cron expression
public  void reSchedule(String cronExpressionStr){
 if(taskScheduler== null){
        this.taskScheduler = new ConcurrentTaskScheduler();
    }
     if (this.scheduledFuture() != null) {
        this.scheduledFuture().cancel(true);
    }
 this.scheduledFuture = this.taskScheduler.schedule(this, new CronTrigger(cronExpressionStr));
}

@Override
public  void run(){
// task to be performed 
}

//if you want on application to read data on startup from db and schedule the schduler use following method
 @PostConstruct
  public void initializeScheduler() {
    //@postcontruct method will be called after creating all beans in application context
    // read user config map from db 
    // get cron expression created 
    this.reSchedule(cronExp);
  }

}

这篇关于Spring Scheduler动态更改cron表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆