2013-06-24 1 views
2

При закрытии tomcat я вижу, что весенние управляемые бобы уничтожаются, среди которых есть dataSource. Spring инструктирует кварц завершить работу, а Quartz работает с config waitForJobsToCompleteOnShutdown = true. Так что, когда заканчивает работу, я получаю ниже expection с кварцем, как нет DataSource для того, чтобы получить соединение:Весенние бобы уничтожены, но кварц выполняет очистку и требует данных источника для подключения и исключения исключения

2013-06-24 17:22:47,952 ERROR | schedulerFactoryBean_Worker-1 | org.quartz.core.ErrorLogger  | An error occured while marking executed job complete. job= 'DEFAULT.invoiceResponseJobDetail' 
    org.quartz.JobPersistenceException: Failed to obtain DB connection from data source 'springNonTxDataSource.schedulerFactoryBean': java.lang.NullPointerException 
   at org.quartz.impl.jdbcjobstore.JobStoreCMT.getNonManagedTXConnection(JobStoreCMT.java:173) ~[quartz-2.1.7.jar:na] 
   at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3788) ~[quartz-2.1.7.jar:na] 
   at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3760) ~[quartz-2.1.7.jar:na] 
   at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggeredJobComplete(JobStoreSupport.java:3000) ~[quartz-2.1.7.jar:na] 
   at org.quartz.core.QuartzScheduler.notifyJobStoreJobComplete(QuartzScheduler.java:1753) ~[quartz-2.1.7.jar:na] 
   at org.quartz.core.JobRunShell.run(JobRunShell.java:281) ~[quartz-2.1.7.jar:na] 
   at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) ~[quartz-2.1.7.jar:na] 
    Caused by: java.lang.NullPointerException: null 
   at org.quartz.impl.jdbcjobstore.JobStoreCMT.getNonManagedTXConnection(JobStoreCMT.java:165) ~[quartz-2.1.7.jar:na] 
   ... 6 common frames omitted 

DataSource конфигурация:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/jdbc/springDataSource" /> 
    <property name="lookupOnStartup" value="true" /> 
    <property name="proxyInterface" value="javax.sql.DataSource" /> 
</bean> 

весна кварц конфигурация:

<bean id="schedulerFactoryBean" 
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean" depends-on="dataSource"> 

    <property name="waitForJobsToCompleteOnShutdown"> 
     <value>true</value> 
    </property> 

    <property name="triggers"> 
     <list> 
      <ref bean="accountRequestJobDetailTrigger" /> 
     </list> 
    </property> 

    <property name="schedulerContextAsMap"> 
     <map> 
      <entry key="accountRequestJob" value-ref="accountRequestJob" /> 
     </map> 
    </property> 

    <property name="quartzProperties"> 
     <props> 
      <prop key="org.quartz.scheduler.skipUpdateCheck">true</prop> 
      <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreCMT</prop> 
      <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.PostgreSQLDelegate 
      </prop> 
      <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop> 
      <prop key="org.quartz.jobStore.isClustered">true</prop> 
      <prop key="org.quartz.scheduler.instanceName">SAPClusteredScheduler</prop> 
      <prop key="org.quartz.scheduler.instanceId">AUTO</prop> 
     </props> 
    </property> 

    <property name="dataSource" ref="dataSource" /> 
</bean> 

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

+0

Можем ли мы увидеть ваш конфиг? –

+0

добавил конфигурацию в вопрос – user1920845

ответ

2

Я считаю, вы можете использовать SmartLifeCycle. Пусть ваш bean/class реализует его и удостоверьтесь, что getPhase() возвращает Integer.MIN_VALUE.

также упоминается в этом ответе: https://stackoverflow.com/a/5892829/248082

+0

Нет, это не решило проблему. Это похоже на маркирование компонента bean зависит от другого bean-компонента. – user1920845