Skip to content

Commit

Permalink
[DROOLS-3076] KieSession pool (apache#2099)
Browse files Browse the repository at this point in the history
* [DROOLS-3076] KieSession pool

* [DROOLS-3076] KieSession pool

* [DROOLS-3076] KieSession pool

* [DROOLS-3076] KieSession pool

* [DROOLS-3076] KieSession pool
  • Loading branch information
mariofusco committed Oct 11, 2018
1 parent 92623e2 commit 04d58e7
Show file tree
Hide file tree
Showing 24 changed files with 713 additions and 279 deletions.
Expand Up @@ -35,12 +35,15 @@
import org.drools.compiler.management.KieContainerMonitor;
import org.drools.compiler.reteoo.compiled.ObjectTypeNodeCompiler;
import org.drools.core.InitialFact;
import org.drools.core.SessionConfiguration;
import org.drools.core.SessionConfigurationImpl;
import org.drools.core.common.ProjectClassLoader;
import org.drools.core.impl.InternalKieContainer;
import org.drools.core.impl.InternalKnowledgeBase;
import org.drools.core.impl.KnowledgeBaseImpl;
import org.drools.core.impl.RuleUnitExecutorSession;
import org.drools.core.impl.StatefulKnowledgeSessionImpl;
import org.drools.core.impl.StatefulSessionPool;
import org.drools.core.impl.StatelessKnowledgeSessionImpl;
import org.drools.core.management.DroolsManagementAgent;
import org.drools.core.management.DroolsManagementAgent.CBSKey;
Expand All @@ -61,6 +64,7 @@
import org.kie.api.io.ResourceType;
import org.kie.api.logger.KieLoggers;
import org.kie.api.runtime.Environment;
import org.kie.api.runtime.KieContainerSessionsPool;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.KieSessionConfiguration;
import org.kie.api.runtime.StatelessKieSession;
Expand Down Expand Up @@ -98,6 +102,8 @@ public class KieContainerImpl

private final String containerId;

private final Map<String, KieSessionConfiguration> sessionConfsCache = new ConcurrentHashMap<>();

public KieModule getMainKieModule() {
return kr.getKieModule(getReleaseId());
}
Expand Down Expand Up @@ -442,8 +448,28 @@ public KieSession newKieSession(Environment environment) {
}

public KieSession newKieSession(Environment environment, KieSessionConfiguration conf) {
KieSessionModel defaultKieSessionModel = findKieSessionModel(false);
return newKieSession(defaultKieSessionModel.getName(), environment, conf);
return newKieSession(null, environment, conf);
}

public KieContainerSessionsPool newKieSessionsPool( int initialSize) {
return new KieContainerSessionsPoolImpl(this, initialSize);
}

StatefulSessionPool createKieSessionsPool(String kSessionName, KieSessionConfiguration conf, Environment env, int initialSize, boolean stateless) {
KieSessionModel kSessionModel = kSessionName != null ? getKieSessionModel(kSessionName) : findKieSessionModel(false);
if ( kSessionModel == null ) {
log.error("Unknown KieSession name: " + kSessionName);
return null;
}
KnowledgeBaseImpl kBase = (KnowledgeBaseImpl) getKieBaseFromKieSessionModel( kSessionModel );
return kBase == null ? null : new StatefulSessionPool(kBase, initialSize, () -> {
SessionConfiguration sessConf = conf != null ? (SessionConfiguration) conf : kBase.getSessionConfiguration();
StatefulKnowledgeSessionImpl kSession = stateless ?
kBase.internalCreateStatefulKnowledgeSession( env, sessConf ).setStateless( true ) :
(StatefulKnowledgeSessionImpl) kBase.newKieSession( sessConf, env );
registerNewKieSession( kSessionModel, ( InternalKnowledgeBase ) kBase, kSession );
return kSession;
});
}

private KieSessionModel findKieSessionModel(boolean stateless) {
Expand Down Expand Up @@ -514,29 +540,40 @@ public KieSession newKieSession(String kSessionName, Environment environment, Ki
log.error("Unknown KieSession name: " + kSessionName);
return null;
}
if (kSessionModel.getType() == KieSessionModel.KieSessionType.STATELESS) {
throw new RuntimeException("Trying to create a stateful KieSession from a stateless KieSessionModel: " + kSessionModel.getName());
}
KieBase kBase = getKieBase( kSessionModel.getKieBaseModel().getName() );
if ( kBase == null ) {
log.error("Unknown KieBase name: " + kSessionModel.getKieBaseModel().getName());
return null;
}

KieBase kBase = getKieBaseFromKieSessionModel( kSessionModel );
if ( kBase == null ) return null;

KieSession kSession = kBase.newKieSession( conf != null ? conf : getKieSessionConfiguration( kSessionModel ), environment );
registerNewKieSession( kSessionModel, ( InternalKnowledgeBase ) kBase, kSession );
return kSession;
}

private void registerNewKieSession( KieSessionModel kSessionModel, InternalKnowledgeBase kBase, KieSession kSession ) {
if (isJndiAvailable()) {
wireSessionComponents( kSessionModel, kSession );
}
registerLoggers(kSessionModel, kSession);
registerCalendars(kSessionModel, kSession);

((StatefulKnowledgeSessionImpl) kSession).initMBeans(containerId, ((InternalKnowledgeBase) kBase).getId(), kSessionModel.getName());
((StatefulKnowledgeSessionImpl ) kSession).initMBeans(containerId, kBase.getId(), kSessionModel.getName());

kSessions.put(kSessionModel.getName(), kSession);
return kSession;
}

private void registerLoggers(KieSessionModelImpl kSessionModel, KieRuntimeEventManager kSession) {
private KieBase getKieBaseFromKieSessionModel( KieSessionModel kSessionModel ) {
if (kSessionModel.getType() == KieSessionModel.KieSessionType.STATELESS) {
throw new RuntimeException("Trying to create a stateful KieSession from a stateless KieSessionModel: " + kSessionModel.getName());
}
KieBase kBase = getKieBase( kSessionModel.getKieBaseModel().getName() );
if ( kBase == null ) {
log.error("Unknown KieBase name: " + kSessionModel.getKieBaseModel().getName());
return null;
}
return kBase;
}

private void registerLoggers(KieSessionModel kSessionModel, KieRuntimeEventManager kSession) {
KieLoggers kieLoggers = KieServices.Factory.get().getLoggers();
if (kSessionModel.getConsoleLogger() != null) {
kieLoggers.newConsoleLogger(kSession);
Expand Down Expand Up @@ -616,13 +653,16 @@ public KieSessionConfiguration getKieSessionConfiguration( String kSessionName )
}

private KieSessionConfiguration getKieSessionConfiguration( KieSessionModel kSessionModel ) {
KieSessionConfiguration ksConf = new SessionConfigurationImpl( null, kProject.getClassLoader() );
ksConf.setOption( kSessionModel.getClockType() );
ksConf.setOption( kSessionModel.getBeliefSystem() );
return ksConf;
return sessionConfsCache.computeIfAbsent(kSessionModel.getName(), k -> {
KieSessionConfiguration ksConf = new SessionConfigurationImpl( null, kProject.getClassLoader() );
ksConf.setOption( kSessionModel.getClockType() );
ksConf.setOption( kSessionModel.getBeliefSystem() );
return ksConf;
});
}

public void dispose() {
sessionConfsCache.clear();
kBases.values().forEach( kb -> ( (InternalKnowledgeBase) kb ).setKieContainer( null ) );

Set<DroolsManagementAgent.CBSKey> cbskeys = new HashSet<DroolsManagementAgent.CBSKey>();
Expand Down
@@ -0,0 +1,86 @@
/*
* Copyright 2005 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.drools.compiler.kie.builder.impl;

import org.drools.core.impl.AbstractKieSessionsPool;
import org.drools.core.impl.StatefulSessionPool;
import org.drools.core.impl.StatelessKnowledgeSessionImpl;
import org.kie.api.runtime.KieContainerSessionsPool;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.KieSessionConfiguration;
import org.kie.api.runtime.StatelessKieSession;

public class KieContainerSessionsPoolImpl extends AbstractKieSessionsPool implements KieContainerSessionsPool {

private final KieContainerImpl kContainer;

KieContainerSessionsPoolImpl( KieContainerImpl kContainer, int initialSize ) {
super(initialSize);
this.kContainer = kContainer;
}

@Override
public KieSession newKieSession() {
return newKieSession( null, null );
}

@Override
public KieSession newKieSession( KieSessionConfiguration conf ) {
return newKieSession( null, conf );
}

@Override
public KieSession newKieSession( String kSessionName ) {
return newKieSession( kSessionName, null );
}

@Override
public KieSession newKieSession( String kSessionName, KieSessionConfiguration conf ) {
return getPool(kSessionName, conf, false).get();
}

@Override
public StatelessKieSession newStatelessKieSession() {
return newStatelessKieSession( null, null );
}

@Override
public StatelessKieSession newStatelessKieSession( KieSessionConfiguration conf ) {
return newStatelessKieSession( null, conf );
}

@Override
public StatelessKieSession newStatelessKieSession( String kSessionName ) {
return newStatelessKieSession( kSessionName, null );
}

@Override
public StatelessKieSession newStatelessKieSession( String kSessionName, KieSessionConfiguration conf ) {
return new StatelessKnowledgeSessionImpl( conf, getPool(kSessionName, conf, true) );
}

@Override
protected StatefulSessionPool createStatefulSessionPool( String kSessionName, KieSessionConfiguration conf, boolean stateless ) {
return kContainer.createKieSessionsPool(kSessionName, conf, environment, initialSize, stateless);
}

@Override
protected String getKey(String kSessionName, KieSessionConfiguration conf, boolean stateless) {
String key = kSessionName == null ? (stateless ? "DEFAULT_STATELESS" : "DEFAULT") : kSessionName;
return conf == null ? key : key + "@" + System.identityHashCode( conf );
}
}
Expand Up @@ -135,7 +135,6 @@ public void testSessionCache() {
try {
checkKieSession(ksession);
} finally {
ksession.dispose();
try {
ksession.reset();
checkKieSession(ksession);
Expand Down

0 comments on commit 04d58e7

Please sign in to comment.