Transaction fails with Spring process application connected to Shared Engine

Hi,

I have Spring application connected to the shared engine deployed to Wildfly 10.

Al long as I call non transactional spring components from the process, everything works OK. But when I try to call transactional component from the bean, I get exception (listed below). How to properly configure Spring app with shared engine in order to manage JPA transactions from beans?

In my app I defined singleton bean exposing process engine:

@Component
@Scope(“singleton”)
public class ProcessEngineHolder {

@Resource(mappedName = "java:global/camunda-bpm-platform/process-engine/default")
private ProcessEngine processEngine;

public ProcessEngine getProcessEngine() {
    return processEngine;
}

public void setProcessEngine(ProcessEngine processEngine) {
    this.processEngine = processEngine;
}

public RuntimeService getRuntimeService() {
    return getProcessEngine().getRuntimeService();
}

}

2017-04-07 09:54:19,554 WARN [org.camunda.bpm.engine.jobexecutor] (pool-7-thread-4) ENGINE-14002 Exception while executing job MessageEntity[repeatnull, id=d87c5391-1b66-11e7-a9ad-406c8f172b07, revision=6, duedate=null, lockOwner=aa8e4c29-c26a-4972-8e78-3d41e0917736, lockExpirationTime=Fri Apr 07 10:54:19 CEST 2017, executionId=d878aa0b-1b66-11e7-a9ad-406c8f172b07, processInstanceId=d878aa0b-1b66-11e7-a9ad-406c8f172b07, isExclusive=true, retries=2147483645, jobHandlerType=async-continuation, jobHandlerConfiguration=transition-create-scope, exceptionByteArray=null, exceptionByteArrayId=d8aefc56-1b66-11e7-a9ad-406c8f172b07, exceptionMessage=org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection, deploymentId=e4e2b150-7f33-11e6-8323-406c8f172b07]: : javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1608)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1152)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347)
at com.sun.proxy.$Proxy113.persist(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298)
at com.sun.proxy.$Proxy113.persist(Unknown Source)
at japis.base.dao.AbstractBaseDao.persist(AbstractBaseDao.java:59)
at com.skg.jpk.dao.audit.JpkAuditLogDao.logJpkAudit(JpkAuditLogDao.java:42)
at com.skg.jpk.dao.audit.JpkAuditLogDao$$FastClassBySpringCGLIB$$9401d4e8.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
at com.skg.jpk.dao.audit.JpkAuditLogDao$$EnhancerBySpringCGLIB$$b4ec58a5.logJpkAudit()
at com.skg.jpk.service.JpkService.logJpkAudit(JpkService.java:204)
at com.skg.jpk.service.JpkService.logJpkAudit(JpkService.java:191)
at com.skg.jpk.service.JpkService$$FastClassBySpringCGLIB$$351ee4fe.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:651)
at com.skg.jpk.service.JpkMagService$$EnhancerBySpringCGLIB$$da561178.logJpkAudit()
at com.skg.jpk.process.bpm.ConvertFromCsvBean.execute(ConvertFromCsvBean.java:61)
at com.skg.jpk.process.bpm.ConvertFromCsvBean$$FastClassBySpringCGLIB$$35d507c.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
at com.skg.jpk.process.bpm.ConvertFromCsvBean$$EnhancerBySpringCGLIB$$46ea7e1.execute()
at org.camunda.bpm.engine.impl.bpmn.delegate.JavaDelegateInvocation.invoke(JavaDelegateInvocation.java:36)
at org.camunda.bpm.engine.impl.delegate.DelegateInvocation.proceed(DelegateInvocation.java:54)
at org.camunda.bpm.engine.impl.delegate.DefaultDelegateInterceptor.handleInvocationInContext(DefaultDelegateInterceptor.java:87)
at org.camunda.bpm.engine.impl.delegate.DefaultDelegateInterceptor.handleInvocation(DefaultDelegateInterceptor.java:59)
at org.camunda.bpm.engine.impl.bpmn.behavior.ServiceTaskDelegateExpressionActivityBehavior$3.call(ServiceTaskDelegateExpressionActivityBehavior.java:112)
at org.camunda.bpm.engine.impl.bpmn.behavior.ServiceTaskDelegateExpressionActivityBehavior$3.call(ServiceTaskDelegateExpressionActivityBehavior.java:98)
at org.camunda.bpm.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior.executeWithErrorPropagation(AbstractBpmnActivityBehavior.java:105)
at org.camunda.bpm.engine.impl.bpmn.behavior.ServiceTaskDelegateExpressionActivityBehavior.execute(ServiceTaskDelegateExpressionActivityBehavior.java:123)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute.execute(PvmAtomicOperationActivityExecute.java:41)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute.execute(PvmAtomicOperationActivityExecute.java:26)
at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:81)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.invokeNext(CommandContext.java:187)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performNext(CommandContext.java:166)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:141)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:589)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:565)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationTransitionNotifyListenerStart.eventNotificationsCompleted(PvmAtomicOperationTransitionNotifyListenerStart.java:56)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationTransitionNotifyListenerStart.eventNotificationsCompleted(PvmAtomicOperationTransitionNotifyListenerStart.java:26)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:65)
at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:81)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.invokeNext(CommandContext.java:187)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performNext(CommandContext.java:166)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:141)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:131)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:600)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:575)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:58)
at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:81)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.invokeNext(CommandContext.java:187)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performNext(CommandContext.java:166)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:141)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:131)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:600)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:575)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:58)
at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:81)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.invokeNext(CommandContext.java:187)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performNext(CommandContext.java:166)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:141)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:131)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:600)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:575)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:58)
at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:81)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.invokeNext(CommandContext.java:187)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performNext(CommandContext.java:166)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:141)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:589)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:565)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationTransitionCreateScope.scopeCreated(PvmAtomicOperationTransitionCreateScope.java:34)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationCreateScope.execute(PvmAtomicOperationCreateScope.java:49)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationCreateScope.execute(PvmAtomicOperationCreateScope.java:23)
at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:81)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.invokeNext(CommandContext.java:187)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performNext(CommandContext.java:174)
at org.camunda.bpm.engine.impl.interceptor.CommandContext$1.call(CommandContext.java:157)
at org.camunda.bpm.engine.impl.interceptor.CommandContext$1.call(CommandContext.java:155)
at org.camunda.bpm.engine.impl.context.ProcessApplicationClassloaderInterceptor.call(ProcessApplicationClassloaderInterceptor.java:44)
at org.camunda.bpm.application.AbstractProcessApplication.execute(AbstractProcessApplication.java:117)
at org.camunda.bpm.application.AbstractProcessApplication.execute(AbstractProcessApplication.java:130)
at org.camunda.bpm.engine.impl.context.Context.executeWithinProcessApplication(Context.java:192)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performNext(CommandContext.java:155)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:141)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:131)
at org.camunda.bpm.engine.impl.jobexecutor.AsyncContinuationJobHandler.execute(AsyncContinuationJobHandler.java:75)
at org.camunda.bpm.engine.impl.jobexecutor.AsyncContinuationJobHandler.execute(AsyncContinuationJobHandler.java:35)
at org.camunda.bpm.engine.impl.persistence.entity.JobEntity.execute(JobEntity.java:130)
at org.camunda.bpm.engine.impl.cmd.ExecuteJobsCmd.execute(ExecuteJobsCmd.java:118)
at org.camunda.bpm.engine.impl.interceptor.CommandExecutorImpl.execute(CommandExecutorImpl.java:24)
at org.camunda.bpm.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:104)
at org.camunda.bpm.engine.impl.interceptor.JtaTransactionInterceptor.execute(JtaTransactionInterceptor.java:58)
at org.camunda.bpm.engine.impl.interceptor.ProcessApplicationContextInterceptor.execute(ProcessApplicationContextInterceptor.java:66)
at org.camunda.bpm.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:30)
at org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobsRunnable.executeJob(ExecuteJobsRunnable.java:79)
at org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobsRunnable.run(ExecuteJobsRunnable.java:57)
at org.jboss.threads.SimpleDirectExecutor.execute(SimpleDirectExecutor.java:33)
at org.jboss.threads.QueueExecutor.runTask(QueueExecutor.java:808)
at org.jboss.threads.QueueExecutor.access$100(QueueExecutor.java:45)
at org.jboss.threads.QueueExecutor$Worker.run(QueueExecutor.java:828)
at java.lang.Thread.run(Thread.java:745)
at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:90)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:112)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:47)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$1.doPrepare(StatementPreparerImpl.java:87)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:72)
at org.hibernate.id.enhanced.SequenceStructure$1.getNextValue(SequenceStructure.java:94)
at org.hibernate.id.enhanced.NoopOptimizer.generate(NoopOptimizer.java:40)
at org.hibernate.id.enhanced.SequenceStyleGenerator.generate(SequenceStyleGenerator.java:412)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101)
at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67)
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:775)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:748)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:753)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1146)
… 122 more
Caused by: java.sql.SQLException: javax.resource.ResourceException: IJ000457: Unchecked throwable in managedConnectionReconnected() cl=org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@7d504433[state=NORMAL managed connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@77d88546 connection handles=0 lastReturned=1491551659553 lastValidated=1491551224982 lastCheckedOut=1491551659552 trackByTx=false pool=org.jboss.jca.core.connectionmanager.pool.strategy.OnePool@2abce9a1 mcp=SemaphoreConcurrentLinkedQueueManagedConnectionPool@22138f71[pool=JPKDataSource] xaResource=LocalXAResourceImpl@271f5da8[connectionListener=7d504433 connectionManager=7064413c warned=false currentXid=null productName=PostgreSQL productVersion=9.3.5 jndiName=java:jboss/datasources/JPKDataSource] txSync=null]
at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:146)
at org.jboss.as.connector.subsystems.datasources.WildFlyDataSource.getConnection(WildFlyDataSource.java:66)
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:386)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:87)
… 139 more
Caused by: javax.resource.ResourceException: IJ000457: Unchecked throwable in managedConnectionReconnected() cl=org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@7d504433[state=NORMAL managed connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@77d88546 connection handles=0 lastReturned=1491551659553 lastValidated=1491551224982 lastCheckedOut=1491551659552 trackByTx=false pool=org.jboss.jca.core.connectionmanager.pool.strategy.OnePool@2abce9a1 mcp=SemaphoreConcurrentLinkedQueueManagedConnectionPool@22138f71[pool=JPKDataSource] xaResource=LocalXAResourceImpl@271f5da8[connectionListener=7d504433 connectionManager=7064413c warned=false currentXid=null productName=PostgreSQL productVersion=9.3.5 jndiName=java:jboss/datasources/JPKDataSource] txSync=null]
at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.reconnectManagedConnection(AbstractConnectionManager.java:933)
at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:750)
at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:138)
… 143 more
Caused by: javax.resource.ResourceException: IJ000461: Could not enlist in transaction on entering meta-aware object
at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.managedConnectionReconnected(TxConnectionManagerImpl.java:560)
at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.reconnectManagedConnection(AbstractConnectionManager.java:928)
… 145 more
Caused by: javax.transaction.SystemException: IJ000356: Failed to enlist: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 0:ffff0a0500ad:e4ef9e1:58e743eb:92 status: ActionStatus.ABORT_ONLY >
at org.jboss.jca.core.connectionmanager.listener.TxConnectionListener$TransactionSynchronization.checkEnlisted(TxConnectionListener.java:942)
at org.jboss.jca.core.connectionmanager.listener.TxConnectionListener.enlist(TxConnectionListener.java:394)
at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.managedConnectionReconnected(TxConnectionManagerImpl.java:553)
… 146 more

I found, that the problem is in transaction manager. I have TransactionManager bean defined in my application. The problem is, that shared engine has it’s own transaction manager assigned to the JtaProcessEngineConfiguration.transactionManager. And mine is org.springframework.transaction.jta.JtaTransactionManager and engine’s is javax.transaction.TransactionManager.
Is it possible to define common transaction manager in such configuration?