【问题标题】:Spring Scheduler change cron expression dynamicallySpring Scheduler 动态更改 cron 表达式
【发布时间】:2013-12-31 00:51:03
【问题描述】:

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

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

使用 Spring 3.XX

【问题讨论】:

标签: java spring cron quartz-scheduler


【解决方案1】:

其实我也遇到过同样的问题

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

首先,您需要根据用户给定的日期时间创建 cron 表达式 以下代码将创建 cron 表达式,它需要一个映射并将 cron 表达式作为字符串返回。

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 表达式后,我们遇到了触发调度程序的问题。

创建一个扩展可运行的类:

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);
  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-18
    • 2019-04-25
    • 2013-05-23
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 2019-02-17
    • 2018-06-24
    相关资源
    最近更新 更多