2009-07-27 17 views
13

Estoy implementando Quartz Job Store en Oracle DB usando Spring Framework. Mi ApplicationContext.xml está por debajo deQuartz JobStore con Spring Framework

<bean id="driverJob" class="org.springframework.scheduling.quartz.JobDetailBean"> 
    <property name="jobClass" value="BatchFileCollector" /> 
</bean> 

<bean id="ranchTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
    <property name="jobDetail" ref="driverJob" /> 
    <property name="startDelay" value="2000" /> 
    <property name="repeatInterval" value="10000" /> 
</bean> 

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="triggers"> 
     <list> 
      <ref bean="ranchTrigger" /> 
     </list> 
    </property> 
    <property name="dataSource"> 
     <ref bean="dataSource.TEXAN"/> 
    </property> 
    <property name="applicationContextSchedulerContextKey"> 
     <value>applicationContext</value> 
    </property> 
    <property name="autoStartup"> 
     <value>true</value> 
    </property> 
    <property name="configLocation" value="classpath:quartz.properties"/> 
</bean> 

Esta configuración me da el siguiente error.

Causado por: org.quartz.JobPersistenceException: No se pudo almacenar el desencadenador: El trabajo (DEFAULT.driverJob) al que hace referencia el desencadenador no existe. [Consulte la excepción anidada: org.quartz.JobPersistenceException: el trabajo (DEFAULT.driverJob) al que hace referencia el desencadenador no existe.]

Estoy usando Spring Framework 2.5.6. ¿Debo actualizar mi versión de Quartz? No puedo encontrar el problema.

Gracias por su ayuda.

+0

favor publicar la traza completa, no sólo el texto de la excepción – skaffman

+0

Usted puede ir a través de los enlaces siguientes http://jksnu.blogspot.com/2011/03/ quartz-framework-implementation-with.html –

Respuesta

13

Su SchedulerFactoryBean necesita tener el "driverJob" registrada, también. Junto con sus desencadenantes, agregue una lista de detalles de trabajo.

<bean id="job.statistics.DailyQPSValidationJobTrigger" class="org.quartz.CronTrigger"> 
    <property name="name" value="DailyQPSValidationTrigger" /> 
    <property name="jobName" value="DailyQPSValidation" /> 
    <property name="jobGroup" value="Statistics" /> 
    <property name="volatility" value="false" /> 
    <!-- Each day, 4 o'clock AM --> 
    <property name="cronExpression" value="0 0 4 * * ?" /> 
</bean> 

<!-- Scheduler --> 

<bean id="job.SchedulerProperties" class="somecompany.someproduct.util.spring.PropertiesFactoryBean" 
    scope="singleton"> 
    <property name="source"> 
     <props> 
      <prop key="org.quartz.scheduler.instanceId">AUTO</prop> 
      <prop key="org.quartz.scheduler.instanceName">JobCluster</prop> 
      <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop> 
      <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop> 
      <prop key="org.quartz.jobStore.isClustered">true</prop> 
      <prop key="org.quartz.jobStore.useProperties">false</prop> 
     </props> 
    </property> 
</bean> 

<bean id="job.Scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" scope="singleton" 
    lazy-init="false"> 
    <property name="startupDelay" value="30" /> 
    <property name="waitForJobsToCompleteOnShutdown" value="true" /> 
    <property name="dataSource" ref="jdbc.DataSource" /> 
    <property name="quartzProperties" ref="job.SchedulerProperties" /> 
    <property name="jobDetails"> 
     <list> 
      <ref bean="job.statistics.DailyQPSValidationJobDetail" /> 
     </list> 
    </property> 
    <property name="triggers"> 
     <list> 
      <ref bean="job.statistics.DailyQPSValidationJobTrigger" /> 
     </list> 
    </property> 
    <property name="schedulerListeners"> 
     <list> 
      <bean class="somecompany.someproduct.job.SchedulerErrorListener"> 
       <property name="monitoringService" ref="monitoring.MonitoringService" /> 
      </bean> 
     </list> 
    </property> 
    <property name="globalJobListeners"> 
     <list> 
      <bean class="somecompany.someproduct.job.JobErrorListener"> 
       <property name="name" value="JobErrorListener" /> 
       <property name="monitoringService" ref="monitoring.MonitoringService" /> 
      </bean> 
     </list> 
    </property> 
</bean> 
+0

Creo que no hay necesidad de agregar driverJob a SchedulerFactoryBean porque ranchTrigger Bean incluye driverJob. ¿Podría enviar una configuración de muestra para Quartz JobStore utilizando Spring Framework? – firstthumb

+0

¿Crees o has intentado? Solo agregue el trabajo al planificador. Y revise su jobClass "BatchFileCollector". ¿Es realmente parte del paquete predeterminado? Y debe darle al Trabajo un nombre y un grupo y hacer referencia a él desde el Disparador ... Añado un ejemplo. – cafebabe

0

no estoy seguro de si esto va a funcionar, pero se podría tratar de usar:

<bean id="driverJob" .../> 

en lugar de:

<bean name="driverJob" .../> 
+0

No funciona. La clase BatchFileCollector amplía org.springframework.scheduling.quartz.QuartzJobBean. – firstthumb

3

que tienen el mismo problema con cuarzo 1.5.2 y 3.0.4 primavera. El problema es que la clase JobStoreSupport intenta almacenar un desencadenador cron con una clave externa para el trabajo (intenta cargar el trabajo desde el archivo db), que aún no se ha conservado.

Mismo problema con las versiones de cuarzo 1.6.1, 1.7.2.

<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" 
     depends-on="quartzDatabaseCreator"> 
    <property name="autoStartup"> 
     <value>true</value> 
    </property> 
    <property name="dataSource"> 
     <ref bean="dataSource"/> 
    </property> 
    <property name="quartzProperties"> 
     <props> 
      <prop key="org.quartz.jobStore.selectWithLockSQL">SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ? 
      </prop> 
      <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.${qrtz.delegateClass} 
      </prop> 
     </props> 
    </property> 
    <property name="triggers"> 
     <list> 
      <ref bean="cronTrigger"/> 
     </list> 
    </property> 
    <property name="schedulerContextAsMap"> 
     <map> 
      <entry key="sygnoServerHelper"><ref bean="sygnoServerHelper"/></entry> 
      <entry key="requestDAO"><ref bean="requestDAO"/></entry> 
      <entry key="alairoCache"><ref bean="alairoCache"/></entry> 
     </map> 
    </property> 
</bean> 

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
    <property name="jobDetail" ref="checkGracePeriodJob" /> 
    <!--         # s m h dom mon dow [y] --> 
    <property name="cronExpression" value="0 0/5 * * * ?" /> 
</bean> 

<bean id="checkGracePeriodJob" class="org.springframework.scheduling.quartz.JobDetailBean"> 
    <property name="jobClass" value="com.synergon.sygnoserver.CheckGracePeriodJob"/> 
</bean> 

+1

¿Y cuál es la solución a este problema? – Abdull

Cuestiones relacionadas