当前位置: 首页 > 面试题库 >

Spring Scheduler动态更改cron表达式

洪弘毅
2023-03-14
问题内容

我能够在applicationContext.xml中创建taskScheduler,并且根据该cron属性定期触发我的工作。

我想cron在调度程序启动后更改此表达式(触发时间),这意味着JavaEE应用程序正在运行。

使用Spring 3.XX


问题答案:

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

我假设您需要从用户那里获取date(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);
  }

}


 类似资料:
  • 我有一些时间 现在的条件是,当JVM启动时,它将首先检查当前时间和给定时隙的持续时间。下面是检查时长的方法:- 例如,如果JVM在今天17PM开始,那么它将首先检查时隙,它将得到13PM到19PM之间的时隙,并且根据方法findNextSlotDuration将是2小时,因此调度器将在2小时后开始,即在19PM。另一种情况是,如果JVM今天在19小时00分29秒启动,那么它将得不到插槽,那么持续时

  • 我正在尝试在特定时间调用API。但有时api调用可能会失败,所以我制定了一个逻辑来检查api调用何时失败。 确认api调用失败后,我想将@Schedulercron表达式从当前cron表达式更改为15分钟后。 如何动态更改cron表达式?? 下面是我的API调用代码。

  • 我试图在集群模式下使用camel-quartz2组件和jdbcjobstore。 quartz.properties文件: 或者,我可以为camel-quartz2组件打补丁,如下所示(org.apache.camel.component.quartz2.quartzendpoint#AddJobInScheduler): 与项目存储库中的当前版本不同,我的版本总是创建新的触发器,如果触发器已经存

  • 问题内容: 我想构建一个表格,该表格可以根据其他组件的状态动态更改可见的组件。 例如,…有一些文本框和一些复选框,并且如果用户激活了某个复选框,则应该出现一堆其他输入元素。 我可以使用JSF 2.0 + Tomahawk来做到这一点吗,还是必须让另一个库来做到这一点?我该怎么办呢?没有AJAX,这将无法工作,对吗? 提前致谢! 问题答案: Ajax是实现此目的的便捷方法,而JSF 2.0捆绑了aj

  • 我有点卡在最新的石英2.2和spring 4.1上...这里有一个cron触发器,为了清楚起见,我省略了这个工作和其他一些琐碎的事情: 现在,我需要在运行时更改它的cronExpression,而且这并不像我想象的那么简单。我无法引用bean并更改属性,因为它是一个提供CronTrigger接口的工厂,而CronTrigger接口不再具有setCronExpression方法,它已经变得不可变。然

  • 我正在使用石英调度程序来安排我的工作。我有一个错误的cron表达式: 当我这样做的时候: is。但是当我查看表达式时,它显然是错误的。其他人也面临类似的问题吗? 注:包装为:包装组织。石英 石英的版本是:2.2.3 请检查来自的CronExpression类http://www.javadoc.io/doc/org.quartz-scheduler/quartz/2.2.3 我还尝试了类的方法,但