diff --git a/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java b/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java index 250fc1e2993..2a01c310245 100755 --- a/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java +++ b/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/AbstractEngineConfiguration.java @@ -750,7 +750,7 @@ public void initSessionFactories() { initDbSqlSessionFactory(); } - addSessionFactory(new GenericManagerFactory(EntityCache.class, EntityCacheImpl.class)); + addSessionFactory(new GenericManagerFactory(EntityCache.class, EntityCacheImpl::new)); if (isLoggingSessionEnabled()) { if (!sessionFactories.containsKey(LoggingSession.class)) { diff --git a/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/persistence/GenericManagerFactory.java b/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/persistence/GenericManagerFactory.java index ab0c8834240..9e85d22298d 100644 --- a/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/persistence/GenericManagerFactory.java +++ b/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/persistence/GenericManagerFactory.java @@ -13,6 +13,9 @@ package org.flowable.common.engine.impl.persistence; +import java.util.function.Function; +import java.util.function.Supplier; + import org.flowable.common.engine.api.FlowableException; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.common.engine.impl.interceptor.Session; @@ -25,13 +28,35 @@ public class GenericManagerFactory implements SessionFactory { protected Class typeClass; - protected Class implementationClass; + protected Function sessionCreator; - public GenericManagerFactory(Class typeClass, Class implementationClass) { + public GenericManagerFactory(Class typeClass, Supplier sessionCreator) { + this(typeClass, context -> sessionCreator.get()); + } + + public GenericManagerFactory(Class typeClass, Function sessionCreator) { this.typeClass = typeClass; - this.implementationClass = implementationClass; + this.sessionCreator = sessionCreator; + } + + /** + * @deprecated use {@link #GenericManagerFactory(Class, Supplier)} instead + */ + @Deprecated + public GenericManagerFactory(Class typeClass, Class implementationClass) { + this(typeClass, commandContext -> { + try { + return implementationClass.getConstructor().newInstance(); + } catch (Exception e) { + throw new FlowableException("couldn't instantiate " + implementationClass.getName() + ": " + e.getMessage(), e); + } + }); } + /** + * @deprecated use {@link #GenericManagerFactory(Class, Supplier)} instead + */ + @Deprecated public GenericManagerFactory(Class implementationClass) { this(implementationClass, implementationClass); } @@ -43,10 +68,6 @@ public Class getSessionType() { @Override public Session openSession(CommandContext commandContext) { - try { - return implementationClass.getConstructor().newInstance(); - } catch (Exception e) { - throw new FlowableException("couldn't instantiate " + implementationClass.getName() + ": " + e.getMessage(), e); - } + return sessionCreator.apply(commandContext); } } diff --git a/modules/flowable-engine/src/main/java/org/flowable/engine/impl/cfg/ProcessEngineConfigurationImpl.java b/modules/flowable-engine/src/main/java/org/flowable/engine/impl/cfg/ProcessEngineConfigurationImpl.java index eb906ee3f31..25392d01879 100755 --- a/modules/flowable-engine/src/main/java/org/flowable/engine/impl/cfg/ProcessEngineConfigurationImpl.java +++ b/modules/flowable-engine/src/main/java/org/flowable/engine/impl/cfg/ProcessEngineConfigurationImpl.java @@ -1355,7 +1355,7 @@ public void initSessionFactories() { addSessionFactory(new AgendaSessionFactory(agendaFactory)); } - addSessionFactory(new GenericManagerFactory(EntityCache.class, EntityCacheImpl.class)); + addSessionFactory(new GenericManagerFactory(EntityCache.class, EntityCacheImpl::new)); commandContextFactory.setSessionFactories(sessionFactories);