gpt4 book ai didi

java - Spring Scheduler动态更改cron表达式

转载 作者:行者123 更新时间:2023-12-03 23:01:33 25 4
gpt4 key购买 nike

我能够在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);
}

}

关于java - Spring Scheduler动态更改cron表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20546403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com