[jboss-jira] [JBoss JIRA] (DROOLS-771) Drools JPA/JTA/Spring integration: "EntityManager is closed"

Julien Serdaru (JIRA) issues at jboss.org
Thu Apr 23 12:24:52 EDT 2015


     [ https://issues.jboss.org/browse/DROOLS-771?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Julien Serdaru updated DROOLS-771:
----------------------------------
    Summary: Drools JPA/JTA/Spring integration: "EntityManager is closed"   (was: Drools JPA/JTA integration: "EntityManager is closed" )


> Drools JPA/JTA/Spring 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