2017-02-20 55 views
1

Может ли кто-нибудь дать мне пример того, как вызывать транзакции БД в запланированных задачах, используя Spring Boot 1.4.2.RELEASE, пожалуйста? Большое спасибо.Как сделать транзакции базы данных в запланированных задачах в Spring Boot 1.4.2.RELEASE

Я использовал Spring Boot 1.4.2.RELEASE для создания запланированной задачи через @Scheduled(fixedRate = 5000) @Transactional(propagation = Propagation.REQUIRES_NEW) и использовал @Autowired, чтобы получить экземпляр JpaRepository.

@Scheduled(fixedRate = 5000) 
@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void importDataFromDat() { 
    List records = datUploadRecordRepository.findAllByImportTime(); 

    for (DatUploadRecord record : records) { 

     record.setImportTime(new Date()); 
     datUploadRecordRepository.save(record); 
    // datUploadRecordRepository.updateImportTime(new Date(), record.getId()); 
    } 
} 
  1. Он может вернуть результаты выбора SQL, но он не может сохранить объекты в БД.
  2. Если я создаю свой собственный метод обновления в моем собственном JpaRepository вместо вызова метода сохранения(), то это вызовет ошибку ниже:

org.springframework.dao.InvalidDataAccessApiUsageException: Выполнение обновленные данные/удалить запрос; вложенное исключение javax.persistence.TransactionRequiredException: Выполнение в обновление/удаление запроса на org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible (EntityManagerFactoryUtils.java:413) ~ [весна-ОРМ-4.3.4.RELEASE. jar: 4.3.4.RELEASE] в org.springframework.orm.hibernate5.HibernateExceptionTranslator.translateExceptionIfPossible (HibernateExceptionTranslator.java:55) ~ [spring-orm-4.3.4.RELEASE.jar: 4.3.4.RELEASE] at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible (ChainedPersistenceExceptionTranslator.java:59) ~ [пружинно-ТХ-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на org.springframework.dao.support. DataAccessUtils.translateIf Необходимое (DataAccessUtils.java:213) ~ [пружинно-ТХ-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor.java:147) ~ [spring-tx-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) ~ [spring-aop-4.3.4 .RELEASE.jar: 4.3.4.RELEASE] на org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor $ CrudMethodMetadataPopulatingMethodInterceptor.invoke (CrudMethodMetadataPostProcessor.java:133) ~ [весенне-данных JPA-1.10.5. RELEASE.jar: na] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:17 9) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke (ExposeInvocationInterceptor.java:92) ~ [spring-aop- 4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3 .4RELEASE] на org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:213) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на com. sun.proxy. $ Proxy112.updateImportTime (Неизвестный источник) ~ [na: na] в com.crane.schedules.ImportToDBFromDAT.importDataFromDat (ImportToDBFromDAT.java:65) ~ [classes /: na] atcom.crane.schedules.ImportToDBFromDAT $$ FastClassBySpringCGLIB $$ 847b3ccb.invoke() ~ [/ классы: па] в org.springframework.cglib.proxy.MethodProxy.invoke (MethodProxy.java:204) ~ [весна -core-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJoinpoint (CglibAopProxy.java:720) ~ [весенне-AOP-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:157) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation (TransactionInterceptor.java:99) ~ [spring-tx-4.3. 4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:282) ~ [spring-tx-4.3.4.RELEASE.jar: 4.3.4 .RELEASE] на org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:96) ~ [spring-tx-4.3 .4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3. 4.RELEASE] в org.springframework.aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept (CglibAopProxy.java:655) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на com .crane.schedules.ImportToDBFromDAT $$ EnhancerBySpringCGLIB $$ 971e70c9.importDataFromDat() ~ [/ классы: на] в sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) ~ [на: 1.8.0_60] на sun.reflect .NativeMethodAccessorImpl.invoke (Неизвестный источник) ~ [na: 1.8.0_60] на sun.reflect.DelegatingMethodAccessorImpl.invoke (Неизвестный источник) ~ [na: 1.8.0_60] at java.lang.reflect.Method.invoke (Неизвестный источник) ~ [na: 1.8.0_60] на org.springframework.scheduling.support.ScheduledMethodRunnable.run (ScheduledMethodRunnable.java: 65) ~ [spring-context-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run (DelegatingErrorHandlingRunnable.java:54) ~ [spring-context- 4.3.4.RELEASE.jar: 4.3.4.RELEASE] в java.util.concurrent.Executors $ RunnableAdapter.call (Неизвестный источник) [na: 1.8.0_60] в java.util.concurrent.FutureTask.runAndReset (Неизвестно Источник) [na: 1.8.0_60] at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301 (Неизвестно Источник) [na: 1.8.0_60] в java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run (Неизвестно Источник) [na: 1.8.0_60] в java.util.concurrent.ThreadPoolExecutor.runWorker (Неизвестный источник) [na: 1.8.0_60] at java.util.concurrent.ThreadPoolExecutor $ Worker.run (Неизвестный источник) [na: 1.8.0_60] at java.lang.Thread.run (Неизвестный источник) [na: 1.8. 0_60] Вызванный: javax.persistence.TransactionRequiredException: Выполнение обновленные данные/удалить запрос на org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate (AbstractQueryImpl.java:54) ~ [зимуют-EntityManager-5.0.11. Final.jar: 5.0.11.Final] в org.springframework.data.jpa.repository.query.JpaQueryExecuti on $ ModifyingExecution.doExecute (JpaQueryExecution.java:242) ~ [spring-data-jpa-1.10.5.RELEASE.jar: na] в org.springframework.data.jpa.repository.query.JpaQueryExecution.execute (JpaQueryExecution .java: 82) ~ [spring-data-jpa-1.10.5.RELEASE.jar: na] в org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute (AbstractJpaQuery.java:116) ~ [spring-data-jpa-1.10.5.RELEASE.jar: na] в org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute (AbstractJpaQuery.java:106) ~ [spring-data-jpa- 1.10.5.RELEASE.jar: na] в org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.doInvoke (RepositoryFactorySupport.java:482) ~ [spring-data-commons-1.12.5.RELEASE.jar: na] в org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.invoke (RepositoryFactorySupport.java:460) ~ [spring-data-commons-1.12.5.RELEASE.jar: na ] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на org.springframework.data. projection.DefaultMethodInvokingMethodInterceptor.invoke (DefaultMethodInvokingMethodInterceptor.java:61) ~ [spring-data-commons-1.12.5.RELEASE.jar: na] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на org.spring framework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation (TransactionInterceptor.java:99) ~ [spring-tx-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.transaction.interceptor.TransactionAspectSupport. invokeWithinTransaction (TransactionAspectSupport.java:282) ~ [spring-tx-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:96) ~ [spring-tx-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) ~ [spring-aop-4.3.4 .RELEASE.jar: 4.3.4.RELEASE] в org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExcep tionTranslationInterceptor.java:136) ~ [весна-ТХ-4.3.4.RELEASE.jar: 4.3.4.RELEASE] ... 31 общие рамки опущена

+0

Я бы сказал, что метод обновления в вашем репозитории должен быть транзакционным. Не запланированная задача. –

+0

Благодарим вас за ответ. Я сделал метод обновления Transactional, но результат такой же, как и выше. –

+0

Ваша весенняя загрузка правильно активировала транзакционное управление? (I.e. Вы добавили аннотации '@ EnableAutoConfiguration' ' @ EnableJpaRepositories' '@ EnableTransactionManagement' в вашем классе конфигурации?) –

ответ

0

Может быть поздно, но вы не могли бы создать независимый транзакционный Component, который управляет операцией, а затем вызывает ее из задачи?

В нашем приложении мы использовали запланированную задачу для очистки документа. Он вызывает службу документа, чтобы получить все документы (транзакционная операция), а затем очистить каждый документ (метод очистки из службы документа также является транзакционным)