Query / Update Spring 3 Запланированная задача cron выражение - PullRequest
0 голосов
/ 09 сентября 2011

У меня запланированное задание, настроенное в файле XML:

<task:scheduled-tasks scheduler="taskScheduler">
  <task:scheduled ref="scheduledJobs" method="doSomething" cron="30 * * * * ?"/>
</task:scheduled-tasks>

<bean id="scheduledJobs" class="com.xxx.ScheduledJobs"/>

<task:scheduler id="taskScheduler" pool-size="2" />

Можно ли запросить выражение cron (для отображения пользователю) и обновить его (не обязательно в файле XML, но вэкземпляр bean) с новым выражением cron?

Или есть ли лучший способ достичь этого типа функциональности?

Ответы [ 2 ]

0 голосов
/ 28 августа 2015

Вы можете достичь этого программным путем, сокращенная версия:

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.support.CronTrigger;

public class ChangelogDeleterTask implements InitializingBean, Runnable {

    @Autowired
    private TaskScheduler scheduler;
    private ScheduledFuture<?> scheduledTask;
    private CronTrigger trigger;
    private Date nextExecutionTime;

    @Override
    public void afterPropertiesSet() throws Exception {
    schedule("0/5 * * * * *");
    }

    @Override
    public void run() {/*do scheduled job*/}

    public synchronized void schedule(String cronExpression) {
    scheduledTask.cancel(false);
    trigger = new MyCronTrigger(cronExpression);
    scheduledTask = scheduler.schedule(this, trigger);
    }

    String getNextExecutionTime() {
    return nextExecutionTime.toString();
    }

    String getExpression() {
    return trigger.getExpression();
    }

    /**
     * Class allows to remember nextExecutionTime.
     */
    private class MyCronTrigger extends CronTrigger {
    public ChangelogCronTrigger(String expression) {
        super(expression);
    }

    @Override
    public Date nextExecutionTime(TriggerContext triggerContext) {
        Date date = super.nextExecutionTime(triggerContext);
        nextExecutionTime = new Date(date.getTime());
        return date;
    }
    }
}
0 голосов
/ 16 сентября 2011

Я полагаю, что ответ заключается в том, что это невозможно при использовании планирования Spring / JDK, но возможно, если вместо этого вы используете планирование кварца:

Существует другой поток, охватывающий аналогичную область:

Динамическое перепланирование CronTriggerBean с теми же сведениями о работе весной

...