2012-05-29 2 views
3

Я использую кварц, Spring with Hibernate, как поставщик JPA. База данных - это Oracle.Кварц с пружиной, не совершающий

У меня есть метод, который записывает файл в файловую систему и обновляет базу данных с подробностями. Этот метод может быть вызван двумя способами:

  1. Использование веб-службы
  2. Или, как запланированная quatrz работу.

Я настроил кварц, как:

<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" scope="singleton"> 
     <property name="autoStartup" value="true"/> 
     <property name="waitForJobsToCompleteOnShutdown" value="true"/> 
     <property name="overwriteExistingJobs" value="true"/> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="transactionManager" ref="transactionManager"/> 
     <property name="quartzProperties"> 
      <props> 
       <prop key="org.quartz.scheduler.instanceName">FileScheduler</prop> 
       <prop key="org.quartz.scheduler.instanceId">AUTO</prop> 
       <prop key="org.quartz.jobStore.misfireThreshold">6000</prop> 
       <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop> 
       <prop key="org.quartz.jobStore.driverDelegateClass">${driverDelegateClass}</prop> 
       <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop> 
       <prop key="org.quartz.jobStore.isClustered">true</prop> 
       <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> 
       <prop key="org.quartz.threadPool.threadCount">5</prop> 
       <prop key="org.quartz.threadPool.threadPriority">5</prop> 
      </props> 
     </property> 
    </bean> 

Этот метод использует пружинный управляемую транзакцию.

Проблема в том, когда этот метод вызывается планировщиком кварца, файл создается, но база данных не обновляется (должны быть обновлены две таблицы и одна вставка таблицы).

Я также включил hibernate show_SQL, но в случае планировщика никаких операторов update \ insert не регистрируются.

Хотя это отлично работает, когда этот метод вызывается запросом веб-службы. Журнал показывает update \ insert.

UPDATE 1

Резюмируя мою проблему, это то, что я пытаюсь достичь:

  1. Создать новую запись в таблице сотрудников.
  2. Сохраните employee_id в job_store (кварце).
  3. При срабатывании триггера кварц возвращает employee_id
  4. Извлеките (загрузите) запись сотрудника на основе этого ключа.
  5. Отправить Работнику уведомления по электронной почте
  6. Update Уведомление со статусом, как «Отправленные» (вставить заявление)

В конце концов, я надеюсь, что все таблицы должны быть обновлены.

Когда кварц запускает задание, все работает кроме пункта 6. Код верен, так как при вызове этого метода с помощью вызова веб-службы таблица обновляется.

UPDATE 2

Я обновил код, чтобы использовать

<prop key="org.quartz.jobStore.class">org.springframework.scheduling.quartz.LocalDataSourceJobStore</prop> 

, но это также doest'nt помощь.

Пожалуйста, помогите. Благодарю. Adi

ответ

2

Кварц работает в своем собственном контексте, даже если начали с помощью методов Spring удобства, так что вы на самом деле не в конечном итоге получить весь свой контекст Spring приложения, если вы явно на JobDataMap, чтобы пройти в бобах (см http://forum.springsource.org/showthread.php?76974-Why-autowired-doesn-t-work-on-a-QuartzJobBean-bean). Таким образом, вы можете передать весенне-управляемые компоненты, но все это кажется беспорядочным, если вам не нужны полные возможности Quartz.

Если ваши потребности планирования не так уж сложны, вы можете рассмотреть вопрос об использовании @Scheduled Spring аннотации (see here), а затем весь вызов методы происходит естественным образом в контексте Spring, и ваши транзакции будут работать, как они делают в вызове веб-службы.

+0

спасибо, но задания получают правильно из базы данных планировщиком. JobMap содержит primayKey таблицы «User», а класс User заполняется после вызова загрузки с помощью этого ключа. Это «слияние» не работает. Вот почему я сказал, что не вижу «вставить» SQL в журналы. Я могу видеть все правильные выражения «select». – adi

+0

Я согласен с Aaron, но если вы все еще хотите использовать кварц, убедитесь, что Entitymanager правильно передан в кварцевую работу. – ayengin

1

Вот две точки, чтобы проверить:

  • Источник данных должен быть источником данных без XA. Если вы используете пул соединений с сервера приложений Java EE, есть вероятность, что у вас есть источник данных XA. Либо настройте, чтобы источник данных был не-XA (если ваша установка приложения и сервер этого допускают), либо создайте второй источник данных, отличных от XA, и передайте его в свойство nonTransactionalDataSource. Одна маленькая ошибка, если вы используете свойство nonTransactionalDataSource - не забудьте сохранить набор свойств dataSource. Вы не можете определить nonTransactionalDataSource без установки (транзакционного) dataSource.

  • Убедитесь, что ваш код действительно работает в транзакции Spring. Имейте ваши бобы, введенные в работу кварца, используя свойство schedulerContextAsMapSchedulerFactoryBean. Если вы запускаете код, аннотированный с помощью @Transactional, он должен быть автообновлен. Если вы жестко запрограммируете экземпляр этого компонента, Spring не сможет применить аннотацию @Transactional и молча игнорировать ее.

Также удалите org.quartz.jobStore.class. SchedulerFactoryBean переопределит эту настройку в любом случае. Он ставит LocalDataSourceJobStore, и может возникнуть путаница, если более новые версии фабрики решают поставить что-то еще.

Последнее, но не в последнюю очередь Мне интересно, если вы, возможно, пропустили какие-либо исключения, которые где-то регистрировались? Убедитесь, что вы отслеживаете все сообщения журнала Spring и все сообщения об ошибках с вашего сервера приложений.

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