Skip to content

Commit

Permalink
Upgraded to drools 7 with session pool usage
Browse files Browse the repository at this point in the history
  • Loading branch information
Anoop Nair committed Jun 17, 2019
1 parent 6247f09 commit 1d0939e
Show file tree
Hide file tree
Showing 11 changed files with 84 additions and 61 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@
.classpath
.project
.settings
/.idea/
*.iml
6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 7 additions & 7 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@

<properties>
<java.version>1.8</java.version>
<kie.version>6.5.0.Final</kie.version>
<spring.version>4.3.8.RELEASE</spring.version>
<slf4j.version>1.7.25</slf4j.version>
<kie.version>7.23.0.Final</kie.version>
<spring.version>5.1.7.RELEASE</spring.version>
<slf4j.version>1.7.26</slf4j.version>
</properties>

<dependencies>
Expand All @@ -37,12 +37,12 @@
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
<version>4.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
Expand Down Expand Up @@ -81,7 +81,7 @@
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.8</version>
<version>0.8.4</version>
<executions>
<execution>
<id>pre-unit-test</id>
Expand All @@ -104,7 +104,7 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
<encoding>UTF-8</encoding>
<additionalparam>-Xdoclint:none</additionalparam>
</configuration>
</plugin>
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/org/anair/drools/fluent/api/RulesExecution.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ public class RulesExecution {
protected static final String NUMBER_OF_RULES_FIRED = "numberOfRulesFired";
private static final String RULES_LOGGER_NAME = "rules-audit";

private static Logger LOG = LoggerFactory.getLogger(RulesExecution.class);
private static Logger RULES_LOG = LoggerFactory.getLogger(RULES_LOGGER_NAME);
private static final Logger LOG = LoggerFactory.getLogger(RulesExecution.class);
private static final Logger RULES_LOG = LoggerFactory.getLogger(RULES_LOGGER_NAME);

private Collection<Object> facts;
private Map<String, Object> globals = new HashMap<>();
Expand Down Expand Up @@ -243,7 +243,7 @@ private void fireKieSessionRules() {
int numberOfRulesFired = this.kieSession.fireAllRules();
if(LOG.isDebugEnabled()){
sw.stop();
LOG.debug("Fired {} rules on a Stateful Kie Session. Execution time: {}", numberOfRulesFired, sw.toString());
LOG.debug("Fired {} rules on a Stateful Kie Session. Execution time: {}", numberOfRulesFired, sw);
}
firedRulesReturnValues.setNumberOfRulesFired(numberOfRulesFired);
}
Expand Down Expand Up @@ -272,7 +272,7 @@ private void fireStatelessKieSessionRules(){
this.statelessKieSession.execute(facts);
if(LOG.isDebugEnabled()){
sw.stop();
LOG.debug("Fired rules on a Stateless Kie Session. Execution time: {}", sw.toString());
LOG.debug("Fired rules on a Stateless Kie Session. Execution time: {}", sw);
}
}

Expand Down Expand Up @@ -320,7 +320,7 @@ private void fireStatelessKieSessionRulesBatchExecution(){

if(LOG.isDebugEnabled()){
sw.stop();
LOG.debug("Fired {} rules on a Stateless Kie Session in batch mode. Execution time: {}", firedRulesReturnValues.getNumberOfRulesFired(), sw.toString());
LOG.debug("Fired {} rules on a Stateless Kie Session in batch mode. Execution time: {}", firedRulesReturnValues.getNumberOfRulesFired(), sw);
}
}

Expand Down
10 changes: 8 additions & 2 deletions src/main/java/org/anair/drools/fluent/api/SessionBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public class SessionBuilder {
private KieSessionProvider kieSessionProvider;
private long pollingIntervalMillis = 0;
private String releaseId;
private int sessionPoolSize = 10;

public SessionBuilder(KieSessionProvider kieSessionProvider) {
this.kieSessionProvider = kieSessionProvider;
Expand All @@ -35,17 +36,22 @@ public SessionBuilder pollingIntervalMillis(long pollingIntervalMillis) {
this.pollingIntervalMillis = pollingIntervalMillis;
return this;
}

public SessionBuilder sessionPoolSize(int sessionPoolSize) {
this.sessionPoolSize = sessionPoolSize;
return this;
}

public KieSession fetchKieSession(String sessionName){
return this.kieSessionProvider.getStatefulKieSession(releaseId, pollingIntervalMillis, sessionName);
return this.kieSessionProvider.getStatefulKieSession(releaseId, pollingIntervalMillis, sessionName, sessionPoolSize);
}

public KieSession fetchKieSession(){
return fetchKieSession(DEFAULT_SESSION_NAME);
}

public StatelessKieSession fetchStatelessKieSession(String sessionName){
return this.kieSessionProvider.getStatelessKieSession(releaseId, pollingIntervalMillis, sessionName);
return this.kieSessionProvider.getStatelessKieSession(releaseId, pollingIntervalMillis, sessionName, sessionPoolSize);
}

public StatelessKieSession fetchStatelessKieSession(){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@


public class KieContainerProviderImpl implements KieContainerProvider {
private static Logger LOG = LoggerFactory.getLogger(KieContainerProviderImpl.class);
private final Map<ReleaseId, KieContainer> kieContainerCache = new ConcurrentHashMap<ReleaseId, KieContainer>();
private static final Logger LOG = LoggerFactory.getLogger(KieContainerProviderImpl.class);
private final Map<ReleaseId, KieContainer> kieContainerCache = new ConcurrentHashMap<>();
private KieServices kieServices;

@Override
Expand All @@ -33,7 +33,7 @@ public KieContainer getKieContainer(String releaseId, long pollingIntervalMillis
LOG.debug("Kie Container not found in cache. Acquiring...");
KieContainer kieContainer = this.createKieContainer(releaseIdObj);
if(kieContainer == null){
throw new RuntimeException("Kie Container not found for knowledge module: {}");
throw new RulesSupportRuntimeException("Kie Container not found for knowledge module: {}");
}
LOG.debug("Acquired Kie Container");
validateKieContainer(kieContainer);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@
*/
public interface KieSessionProvider {

KieSession getStatefulKieSession(String releaseId, long pollingIntervalMillis, String sessionName);
StatelessKieSession getStatelessKieSession(String releaseId, long pollingIntervalMillis, String sessionName);
KieSession getStatefulKieSession(String releaseId, long pollingIntervalMillis, String sessionName, int sessionPoolSize);
StatelessKieSession getStatelessKieSession(String releaseId, long pollingIntervalMillis, String sessionName, int sessionPoolSize);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@
import org.anair.drools.provider.container.KieContainerProvider;
import org.apache.commons.lang3.StringUtils;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieContainerSessionsPool;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.StatelessKieSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class KieSessionProviderImpl implements KieSessionProvider {

private static Logger LOG = LoggerFactory.getLogger(KieSessionProviderImpl.class);
private static final Logger LOG = LoggerFactory.getLogger(KieSessionProviderImpl.class);
private KieContainerProvider kieContainerProvider;


Expand All @@ -19,42 +20,44 @@ public KieSessionProviderImpl(KieContainerProvider kieContainerProvider) {
}

@Override
public KieSession getStatefulKieSession(String releaseId, long pollingIntervalMillis, String sessionName) {
public KieSession getStatefulKieSession(String releaseId, long pollingIntervalMillis, String sessionName, int sessionPoolSize) {
KieContainer kieContainer = kieContainerProvider.getKieContainer(releaseId, pollingIntervalMillis);
return fetchKieSessionFromContainer(sessionName, kieContainer);
return fetchKieSessionFromContainer(sessionName, kieContainer, sessionPoolSize);
}

@Override
public StatelessKieSession getStatelessKieSession(String releaseId, long pollingIntervalMillis, String sessionName) {
public StatelessKieSession getStatelessKieSession(String releaseId, long pollingIntervalMillis, String sessionName, int sessionPoolSize) {
KieContainer kieContainer = kieContainerProvider.getKieContainer(releaseId, pollingIntervalMillis);
return fetchStatelessKieSessionFromContainer(sessionName, kieContainer);
return fetchStatelessKieSessionFromContainer(sessionName, kieContainer, sessionPoolSize);
}

private KieSession fetchKieSessionFromContainer(String sessionName, KieContainer kieContainer){
KieSession kieSession = null;
private KieSession fetchKieSessionFromContainer(String sessionName, KieContainer kieContainer, int sessionPoolSize){
KieSession kieSession;
KieContainerSessionsPool sessionsPool = kieContainer.newKieSessionsPool(sessionPoolSize);
if(StringUtils.isBlank(sessionName)){
LOG.debug("Fetching default Stateful Kie Session...");
kieSession = kieContainer.newKieSession();
kieSession = sessionsPool.newKieSession();
LOG.debug("Fetched default Stateful Kie Session");
}else{
LOG.debug("Fetching Stateful Kie Session : {}...", sessionName);
kieSession = kieContainer.newKieSession(sessionName);
kieSession = sessionsPool.newKieSession(sessionName);
LOG.debug("Fetched Stateful Kie Session : {}...", sessionName);
}

return kieSession;
}

private StatelessKieSession fetchStatelessKieSessionFromContainer(String sessionName, KieContainer kieContainer){
StatelessKieSession statelessKieSession = null;

private StatelessKieSession fetchStatelessKieSessionFromContainer(String sessionName, KieContainer kieContainer, int sessionPoolSize){
StatelessKieSession statelessKieSession;
KieContainerSessionsPool sessionsPool = kieContainer.newKieSessionsPool(sessionPoolSize);

if(StringUtils.isBlank(sessionName)){
LOG.debug("Fetching default Stateless Kie Session...");
statelessKieSession = kieContainer.newStatelessKieSession();
statelessKieSession = sessionsPool.newStatelessKieSession();
LOG.debug("Fetched default Stateless Kie Session");
}else{
LOG.debug("Fetching Stateless Kie Session: {}...", sessionName);
statelessKieSession = kieContainer.newStatelessKieSession(sessionName);
statelessKieSession = sessionsPool.newStatelessKieSession(sessionName);
LOG.debug("Fetched Stateless Kie Session: {}", sessionName);
}
return statelessKieSession;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public class RulesExecutionTest {


@Before
public void setUp() throws Exception {
public void setUp() {
mockKieSession = createMock(KieSession.class);
mockStatelessKieSession = createMock(StatelessKieSession.class);
mockFactHandle = createMock(FactHandle.class);
Expand Down Expand Up @@ -78,7 +78,7 @@ public void fireRules_OnStatelessSession_AllConfiguration() {

replay(mockStatelessKieSession, mockAgendaEventListener);

List<Object> factList = new ArrayList<Object>();
List<Object> factList = new ArrayList<>();
factList.add("fact1");
factList.add("fact2");
FiredRulesReturnValues firedRulesReturnValues = new RulesExecution(mockStatelessKieSession)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,12 @@ public void setup(){

@Test
public void fetchDefaultStatelessKieSessionWithPollingInterval() {
expect(mockKieSessionProvider.getStatelessKieSession(RELEASE_ID, 100, SessionBuilder.DEFAULT_SESSION_NAME)).andReturn(mockStatelessKieSession);
expect(mockKieSessionProvider.getStatelessKieSession(RELEASE_ID, 100, SessionBuilder.DEFAULT_SESSION_NAME, 10)).andReturn(mockStatelessKieSession);
replay(mockKieSessionProvider, mockStatelessKieSession);
StatelessKieSession statelessKieSession = new SessionBuilder(mockKieSessionProvider)
.forKnowledgeModule(RELEASE_ID)
.pollingIntervalMillis(100)
.sessionPoolSize(10)
.fetchStatelessKieSession();
verify(mockKieSessionProvider, mockStatelessKieSession);

Expand All @@ -43,7 +44,7 @@ public void fetchDefaultStatelessKieSessionWithPollingInterval() {

@Test
public void fetchNamedStatelessKieSession() {
expect(mockKieSessionProvider.getStatelessKieSession(RELEASE_ID, 100, SESSION_NAME)).andReturn(mockStatelessKieSession);
expect(mockKieSessionProvider.getStatelessKieSession(RELEASE_ID, 100, SESSION_NAME, 10)).andReturn(mockStatelessKieSession);

replay(mockKieSessionProvider, mockStatelessKieSession);
StatelessKieSession statelessKieSession = new SessionBuilder(mockKieSessionProvider)
Expand All @@ -57,12 +58,13 @@ public void fetchNamedStatelessKieSession() {

@Test
public void fetchNamedStatelessKieSession_NotFound() {
expect(mockKieSessionProvider.getStatelessKieSession(RELEASE_ID, 100, SESSION_NAME)).andReturn(null);
expect(mockKieSessionProvider.getStatelessKieSession(RELEASE_ID, 100, SESSION_NAME, 20)).andReturn(null);

replay(mockKieSessionProvider);
StatelessKieSession statelessKieSession = new SessionBuilder(mockKieSessionProvider)
.forKnowledgeModule(RELEASE_ID)
.pollingIntervalMillis(100)
.sessionPoolSize(20)
.fetchStatelessKieSession(SESSION_NAME);
verify(mockKieSessionProvider);

Expand All @@ -71,7 +73,7 @@ public void fetchNamedStatelessKieSession_NotFound() {

@Test
public void fetchDefaultStatelfulKieSession() {
expect(mockKieSessionProvider.getStatefulKieSession(RELEASE_ID, 100, SessionBuilder.DEFAULT_SESSION_NAME)).andReturn(mockKieSession);
expect(mockKieSessionProvider.getStatefulKieSession(RELEASE_ID, 100, SessionBuilder.DEFAULT_SESSION_NAME, 10)).andReturn(mockKieSession);

replay(mockKieSessionProvider, mockKieSession);
KieSession kieSession = new SessionBuilder(mockKieSessionProvider)
Expand All @@ -85,7 +87,7 @@ public void fetchDefaultStatelfulKieSession() {

@Test
public void fetchNamedStatelfulKieSession() {
expect(mockKieSessionProvider.getStatefulKieSession(RELEASE_ID, 100, SESSION_NAME)).andReturn(mockKieSession);
expect(mockKieSessionProvider.getStatefulKieSession(RELEASE_ID, 100, SESSION_NAME, 10)).andReturn(mockKieSession);

replay(mockKieSessionProvider, mockKieSession);
KieSession kieSession = new SessionBuilder(mockKieSessionProvider)
Expand All @@ -99,7 +101,7 @@ public void fetchNamedStatelfulKieSession() {

@Test
public void fetchNamedStatelfulKieSession_NotFound() {
expect(mockKieSessionProvider.getStatefulKieSession(RELEASE_ID, 100, SESSION_NAME)).andReturn(null);
expect(mockKieSessionProvider.getStatefulKieSession(RELEASE_ID, 100, SESSION_NAME, 10)).andReturn(null);

replay(mockKieSessionProvider);
KieSession kieSession = new SessionBuilder(mockKieSessionProvider)
Expand Down
Loading

0 comments on commit 1d0939e

Please sign in to comment.