2012-04-16 3 views
0

Я пытаюсь запланировать задачу в зависимости от ее ответа. Задача что-то вроде:Задача расписания в зависимости от ее ответа

public Date scheduledTask() { 
    Date nextRun; 
    // ... 
    nextRun = something(); 
    // ... 
    return nextRun; 
} 

Как я могу убедиться, что та же задача вызывается снова при достижении nextRun?

спасибо.

+0

Это хороший вариант использования шаблона проектирования стратегии. Пожалуйста, проверьте документацию http://en.wikipedia.org/wiki/Strategy_pattern#Example – Phani

+0

Какой подход из Spring вы используете для планирования задач? В качестве примера может помочь [это] (http://darthanthony.wordpress.com/2009/07/07/dynamic-scheduling-with-javaspring/). – nobeh

+0

Спасибо, @nobeh. К сожалению, ваша ссылка не очень помогает мне, я уже пробовал аналогичный подход, но, по-видимому, у меня нет возможности перенести задачу в зависимости от ее результата. Я пробовал играть с поддержкой Spring Quartz и Spring Namespace Spring 3.0 без везения. Любая помощь приветствуется. Спасибо – satoshi

ответ

0

Это очень просто со стандартным API-интерфейсом Quartz scheduler. Внутри вашего Job вычислить nextRun время и создать триггер с startAt() определенным:

public class ScheduledJob implements Job { 

    @Override 
    public void execute(JobExecutionContext context) throws JobExecutionException { 
     final Date nextRun = something(); 

     Trigger trigger = newTrigger(). 
       startAt(nextRun). 
       forJob(context.getJobDetail()). 
       build(); 

     context.getScheduler().scheduleJob(trigger); 
    } 

} 

испытано, работает как шарм.

+0

Здравствуйте @TomaszNurkiewicz, благодарю вас за помощь. Ваш подход кажется очень хорошим, единственное, что я должен буду запускать его вручную в первый раз, когда приложение запускается. Каков наилучший способ сделать это? Может быть, вы можете показать мне свою конфигурацию Quartz XML? Большое спасибо. – satoshi

0

Следуйте идеи упомянутых here, то вы должны быть в состоянии иметь:

public class GuaranteeSchedule implements Trigger { 

    private Future<?> resultForNextRun; 
    private TaskScheduler scheduler; 

    public void scheduledTask() { 
    // 'this' is this trigger that is used by the scheduler 
    // and the method `nextExecutionTime` is automatically called by the scheduler 
    resultForNextRun = scheduler.schedule(theTask, this); 
    // theTask is the object that calls something() 
    } 

    // Implementing Trigger to add control dynamic execution time of this trigger 
    @Override 
    public Date nextExecutionTime(TriggerContext tc) { 
    // make sure the result for the previous call is ready using the waiting feature of Future 
    Object result = resultForNextRun.get(); 
    // Use tc or other stuff to calculate new schedule 
    return new Date(); 
    } 

} 

Остальное, вы должны следовать конфигурации, указанную в ссылке. Я считаю, что это решит проблему зависимости следующего вызова триггера от результата предыдущего. Вы также можете быть осторожны при первом звонке scheduledTask, чтобы убедиться, что resultForNextRun != null.

Смежные вопросы