Spring Scheduler动态更改cron表达式
我能够在applicationContext.xml中创建一个taskScheduler,并根据cron
属性定期触发我的作业。
我希望在调度程序启动后更改此cron
表达式(触发周期),我的意思是在JavaEE应用程序运行时。
使用Spring 3.XX
其实我遇到了同样的问题
我假设您需要从用户获取日期(1-31),时间,星期几,调度程序类型(每日,每月,每周)。
首先,您需要从用户的给定日期时间创建cron表达式以下代码将创建cron表达式,它接受映射并将cron表达式作为字符串返回。
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; }
在我们得到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); } }
- 如何在Java中将迭代器实现为类的属性
- 线程“main”中的exceptionjava.lang.NoClassDefFoundError:无法初始化类com.sun.jersey.core.header.MediaTypes
- 是否有一个用于使用日期构造cron表达式的java类?
- 通过Property禁用Spring Scheduler任务
- spring的cron vs普通的cron?
- 使用@Scheduled和@EnableScheduling但给出NoSuchBeanDefinitionException
- 在spring动态安排石英计算机工作?
- Simple Spring,将ClasspathApplicationContext用于独立应用程序,如何重用?
- 安排将来要执行的事件(Android方式的Cron Job)
- Quartz Scheduler – RAM和JDBC Job store之间的区别是什么
- 如何创建Java cron作业