2013-02-27 2 views
1

У нас есть веб-приложение, работающее в Tomcat с использованием Spring Framework. Нам нужно добавить некоторые запланированные задания для повторяющихся операций. Мы столкнулись с Quartz Scheduler для этого и последовали за tutorial for configuring Jobs using Quartz with Spring и получили задание, запланированное и работающее, как ожидалось.Запланированные задания с планировщиком кварца со значениями по умолчанию

У нас есть некоторые задачи, которые планируются при запуске приложения. Теперь мы хотим, чтобы пользователь вручную запускал задания и менял триггер для заданий, но нам нужно, чтобы эти изменения сохранялись в базе данных. Поэтому, когда приложение запускается, оно будет читать сохраненные задачи, а если они не существуют, загрузите задания по умолчанию из файла дескриптора весны.

Для сотрясения простоты, давайте предположим, что мы используем файл beans.xml из примера:

<bean id="processToExecute" class="com.mycompany.ProcessToExecute" /> 

<bean name="processToExecuteJob" class="org.springframework.scheduling.quartz.JobDetailBean"> 
    <property name="jobClass" value="com.mycompany.ProcessToExecuteJob" /> 
    <property name="jobDataAsMap"> 
     <map> 
      <entry key="processToExecute" value-ref="processToExecute" /> 
     </map> 
    </property> 
</bean> 

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
    <property name="jobDetail" ref="processToExecuteJob" /> 
    <property name="cronExpression" value="0/5 * * * * ?" /> 
</bean> 

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="jobDetails"> 
     <list> 
      <ref bean="processToExecuteJob" /> 
     </list> 
    </property> 
    <property name="triggers"> 
     <list> 
      <ref bean="simpleTrigger" /> 
     </list> 
    </property> 
</bean> 

Таким образом, мы хотели бы продолжать использовать бобы-подобные конфигурации для выполнения задач по умолчанию, но опцию загрузите их из базы данных, если они уже запланированы.

Кварц здесь не является обязательным условием, если кто-либо знает более простой способ его достижения, используя Spring @Scheduled, он тоже может быть полезен.

Спасибо за ваше время.

+1

Мало указатель вы можете создали сохраненный магазин, передавая источник данных для SchedulerFactoryBean –

ответ

1

Я, наконец, изо всех сил пытался получить желаемое поведение. При первом запуске приложение планирует задачу и сохраняет ее в базе данных. Это делается просто, указав свойство dataSource на объекте SchedulerFactoryBean.

В настоящее время выполнение заданий бесполезно, поскольку любое изменение, выполняемое для запланированных задач, теряется при перезапуске системы, поскольку вновь созданные задания перезаписывают старые. Таким образом, поведение точно такое же.

Чтобы избежать новых рабочих мест, чтобы перезаписать старые, просто установите overwriteExistingJobs свойство ложного на SchedulerFactoryBean объекта. Так просто. Новые задания игнорируются, поскольку они уже существуют в базе данных.

Это полный пример конфигурации, описанная выше:

<!-- Jobs --> 
<bean name="processToExecuteJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- JobDetailBean on Quartz 1.X --> 
    <property name="jobClass" value="com.mycompany.quartz.ProcessToExecuteJob" /> 
    <property name="name" value="processToExecuteJob"/> 
    <property name="group" value="default"/> 
</bean> 


<!-- Triggers --> 
<bean id="demoTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- CronTriggerBean on Quartz 1.X --> 
    <property name="jobDetail" ref="processToExecuteJob" /> 
    <property name="cronExpression" value="0/15 * * * * ?" /> 
</bean> 


<!-- Database --> 
<jee:jndi-lookup id="quartzDataSource" jndi-name="jdbc/imsQuartzDS" resource-ref="true" /> 


<!-- Scheduler --> 
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="dataSource" ref="quartzDataSource"/> 
    <property name="overwriteExistingJobs" value="false"/> 
    <property name="triggers"> 
     <list> 
      <ref bean="demoTrigger" /> 
     </list> 
    </property> 
</bean> 
Смежные вопросы