I am able to create a taskScheduler in applicationContext.xml, and my job is triggered periodically based on the cron attribute.
I would like to change this cron expression(triggering period) after scheduler start, I mean while JavaEE application is running.
using Spring 3.XX
解决方案
Actually I've faced same issue
I am assuming you will need to get date(1-31) , time, day of week ,type of scheduler (Daily , monthly , weeekly ) from user.
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 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;
}
After we get cron expression we have issue of triggering the scheduler.
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);
}
}