我可以在applicationContext.xml中创建一个taskScheduler,根据属性定期触发我的作业。
我想在调度程序启动后更改这个表达式(触发周期),也就是说,在JavaEE应用程序运行时更改它。
使用Spring 3.XX
我可以在applicationContext.xml中创建一个taskScheduler,根据属性定期触发我的作业。
我想在调度程序启动后更改这个表达式(触发周期),也就是说,在JavaEE应用程序运行时更改它。
使用Spring 3.XX
实际上,我面临了同样的问题。
我假设您需要从用户那里获取日期(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表达式后,我们需要解决触发调度器的问题。
创建一个继承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);
}
}
taskScheduler
bean 定义。 - Sotirios Delimanolis