Spring @Scheduled @Transactional javax.persistence.TransactionRequiredException

时间:2018-12-12 16:22:20

标签: java spring jpa scheduled-tasks

我正在开发springboot应用程序。 在本地,在我的IntelliJ中,它们都能按预期工作,没有任何错误或异常。

有一个通过Rancher的Docker安装程序。我能够将构建的java artefact部署到docker容器中。它确实启动并连接到其数据库,并且几乎可以按预期工作。

问题是Java-Spring- @ Scheduled作业在运行时抛出异常:

2018-12-12_15:08:57.223 TESTING-X [SockJS-6] [ERROR] o.s.s.s.TaskUtils$LoggingErrorHandler:95 - Unexpected error occurred in scheduled task.
javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:282)
at com.sun.proxy.$Proxy118.remove(Unknown Source)
at com.xyz.DataAccessImpl.delete(DataAccessImpl.java:684)
at com.xyz.services.QmStatisticService.lambda$refreshStatistics$3(QmStatisticService.java:155)
at java.util.ArrayList.forEach(ArrayList.java:1249)
...
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

读取是通过查询完成的,并且可以成功进行。 -删除不会。
删除是通过EntityManager.remove(entity)语句完成的。 设置是org.springframework.orm.jpa.JtaTransactionManager;见下文...

为什么系统在不同的环境下处理事务的方式不同。
有谁知道如何解决它,或者有一个线索可以问一个进一步的问题,这可能会帮助...

代码段:

@Bean
@Autowired
public JpaTransactionManager transactionManagerEntityManagerFactory(EntityManagerFactory emf) {

    // https://stackoverflow.com/questions/12337504/hibernatetransactionmanager-or-jpatransactionmanager
    final JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf);
    LOG.info( "using PlatformTransactionManager: "+ transactionManager );
    return transactionManager;
}

编辑:我开始怀疑它们在不同的Java版本上运行。
在我的本地PC上,我在dockerized设置上运行了JDK-1.8,只有JRE-1.8 ...我进行调查并分享我的发现...

0 个答案:

没有答案