[jboss-jira] [JBoss JIRA] (DROOLS-771) Drools JPA/JTA integration: "EntityManager is closed"
Julien Serdaru (JIRA)
issues at jboss.org
Thu Apr 23 12:15:54 EDT 2015
Julien Serdaru created DROOLS-771:
-------------------------------------
Summary: Drools JPA/JTA integration: "EntityManager is closed"
Key: DROOLS-771
URL: https://issues.jboss.org/browse/DROOLS-771
Project: Drools
Issue Type: Bug
Affects Versions: 6.2.0.Final
Reporter: Julien Serdaru
Assignee: Mark Proctor
Migrating to Drools 6.2.0.Final from v5, I am having issues getting JPA persistence to work.
Environment setup: JTA transactions managed by Spring.
// transaction manager is a Spring JTATransactionManager. This seems to activate the KieSpringTransactionManager/KieSpringJpaManager when creating the SingleSessionCommandService.
env.set(EnvironmentName.TRANSACTION_MANAGER, transactionManager);
env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, entityManagerFactory);
Now, in AbstractKieSpringJpaManager::67, the app-scoped entity manager is retrieved using TransactionSynchronizationManager.getResource(this.emf). This call will return the EntityManager bound to the current thread (if any). In my case, since I call drools from within a transaction, the entity manager is not null. Keep in mind that when that EntityManager was created previously, a synchronization to close it has already been registered .
When we go to the transaction synchronization registered by drools at TriggerUpdateTransactionSynchronization.beforeCompletion(), the method accesses the EntityManager to retrieve objects. However, this entity manager has already been closed by Spring in it's own beforeCompletion transaction synchronization, hence the exception (see below).
Also, I see this comment in KieSpringJpaManager:49:
getApplicationScopedPersistenceContext(); // we create this on initialisation so that we own the EMF reference
// otherwise Spring will close it after the transaction finishes
So it seems the problem has been hit before (maybe in another context). However, eagerly creating the entity manager will not solve the problem in my case.
Is that normal behavior?
Exception below:
java.lang.IllegalStateException: EntityManager is closed
at org.hibernate.ejb.EntityManagerImpl.getSession(EntityManagerImpl.java:95) ~[hibernate-entitymanager-4.2.7.Final.jar:4.2.7.Final]
at org.hibernate.ejb.AbstractEntityManagerImpl.contains(AbstractEntityManagerImpl.java:958) ~[hibernate-entitymanager-4.2.7.Final.jar:4.2.7.Final]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_26]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_26]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_26]
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_26]
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:366) ~[spring-orm-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at $Proxy108.contains(Unknown Source) ~[na:na]
at org.drools.persistence.TriggerUpdateTransactionSynchronization.beforeCompletion(TriggerUpdateTransactionSynchronization.java:43) ~[drools-persistence-jpa-6.2.0.Final.jar:6.2.0.Final]
at org.kie.spring.persistence.SpringTransactionSynchronizationAdapter.beforeCompletion(SpringTransactionSynchronizationAdapter.java:54) ~[kie-spring-6.2.0.Final.jar:6.2.0.Final]
at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCompletion(TransactionSynchronizationUtils.java:106) ~[spring-tx-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCompletion(AbstractPlatformTransactionManager.java:938) [spring-tx-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:835) [spring-tx-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:823) [spring-tx-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:493) [spring-tx-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:264) [spring-tx-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) [spring-tx-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) [spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:80) [spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at config.aspect.FacadeExceptionWrapping.wrapRuntimeIntoGenericExceptions(FacadeExceptionWrapping.java:48) [classes/:na]
at sun.reflect.GeneratedMethodAccessor113.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_26]
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_26]
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621) [spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610) [spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:65) [spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) [spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91) [spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) [spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) [spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at $Proxy179.completeReadOnlyTask(Unknown Source) [$Proxy179.class:na]
at com.joss.system.webapp.controller.AbstractEditorController.completeReadOnlyTask(AbstractEditorController.java:283) [classes/:na]
Is that normal behavior?
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)
More information about the jboss-jira
mailing list