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)