Повтор задания из кварца (приложение Spring + Quartz) — Цепочка заданий

У меня есть следующая настройка для работы с кварцем:

    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="actualObject" /><br>
    <property name="targetMethod" value="processData"/>
    <property name="concurrent" value="false"/>
</bean>

    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
    <property name="jobDetail" ref="jobDetail" />
    <property name="startDelay" value="10000" />
    <property name="repeatInterval" value="1000" />
</bean>

И это работает хорошо для меня. Что я хотел бы сделать, так это снова вызвать processData, n, как только он завершится. Я знаю, что лучше всего подходит старый добрый метод while(true), но я хочу сделать это с кварцем.


person Gyan    schedule 30.08.2012    source источник


Ответы (1)


Прежде всего, вы должны объяснить, почему вы «хотите сделать это с помощью кварца», потому что «старое доброе while(true)» является правильным способом реализации вашего варианта использования ( конечно, вам нужна дополнительная нить, но она тоже нужна Quartz). Это звучит как чрезмерная инженерия, поэтому вам лучше иметь вескую причину.

При этом у вас есть два варианта:

  • перепланировать задание так, чтобы оно запускалось сразу после того, как вы его покинете. В общем:

    public class HelloJob implements Job {
    
        public HelloJob() {
        }
    
        public void execute(JobExecutionContext context) throws JobExecutionException
        {
            //do your job...
    
            Trigger trigger = newTrigger().build();
            JobDetail job = newJob(HelloJob.class).build();
            context.getScheduler().scheduleJob(trigger, job);
        }
    }
    

    Вам не нужна конфигурация XML, но вы должны как-то запланировать запуск этого задания в первый раз (например, в @PostConstruct с использованием Scheduler напрямую). В тот момент, когда ваше задание завершится, оно снова запустит то же самое задание, которое было только что перепланировано.

  • JobChainingJobListener может вам помочь, см.: Может ли Quartz Scheduler запускать задания последовательно?

Оба решения очень тяжеловесны по сравнению со "старым добрым while(true)".

person Tomasz Nurkiewicz    schedule 30.08.2012
comment
Спасибо @Tomasz. Я хотел, чтобы это было в кварце из-за моего текущего требования планирования задания, которое меняет состояние системы с каждой итерацией. Я должен написать его таким, как он расширяется на более позднем этапе разработки. Любые примеры или ссылки на основе кода для JobChainingListener были бы замечательными. Я не эксперт по Quartz, но я хотел бы увидеть код. - person Gyan; 01.09.2012