[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