enhance performance

This commit is contained in:
nheron 2021-02-24 15:50:24 +01:00
commit 2ed32a94a4
12 changed files with 142 additions and 26 deletions

View file

@ -105,7 +105,7 @@ public class RuleBaseStatefulSession implements RuleBaseSession {
this.processInstanceList = new HashMap<>();
this.historyListener = historyListener;
if (this.historyListener != null) {
if (this.historyListener != null && this.historyListener.withDetails()) {
this.factListener = new FactHandlerListener(this,cloner);
this.ruleHandlerListener = new RuleHandlerListener(this,cloner);
this.processHandlerListener = new ProcessHandlerListener(this,cloner);

View file

@ -91,11 +91,25 @@ public class SimpleRuleHandlerListener extends DefaultAgendaEventListener implem
@Override
public void afterMatchFired(AfterMatchFiredEvent event) {
logger.debug(">>afterActivationFired", event);
nbRuleFired++;
Match match = event.getMatch();
logger.info(" {} rules name {}", nbRuleFired, match.getRule().toString());
//____ Getting the Rule Object Summary from the session
DroolsRuleObject droolsRuleObject = ruleBaseSession.getDroolsRuleObject(match.getRule());
//____ Creating the specific "After Rule Fired" History Event
AfterRuleFiredHistoryEvent newAfterRuleEvent = new AfterRuleFiredHistoryEvent(this.ruleBaseSession.nextEventId(), this.nbRuleFired, droolsRuleObject, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
ruleBaseSession.addHistoryElement(newAfterRuleEvent);
if (nbRuleFired >= maxNumberRuleToExecute) {
logger.warn(String.format("%d rules have been fired. This is the limit.", maxNumberRuleToExecute));
logger.warn("The session execution will be stop");
KieRuntime runtime = event.getKieRuntime();
this.maxNumerExecutedRulesReached = true;
//(int eventID, int sessionId, int numberOfRulesExecuted, int maxNumberOfRulesForSession)
SessionFireAllRulesMaxNumberReachedEvent sessionFireAllRulesMaxNumberReachedEvent = new SessionFireAllRulesMaxNumberReachedEvent(this.ruleBaseSession.nextEventId(), nbRuleFired, maxNumberRuleToExecute, this.ruleBaseSession.getRuleBaseID(), this.ruleBaseSession.getSessionId());
ruleBaseSession.addHistoryElement(sessionFireAllRulesMaxNumberReachedEvent);
runtime.halt();
}
}
@Override

View file

@ -0,0 +1,36 @@
package org.chtijbug.drools.runtime;
import org.chtijbug.drools.entity.history.HistoryEvent;
import org.chtijbug.drools.runtime.listener.HistoryListener;
import java.util.ArrayList;
import java.util.List;
/**
* Created by nheron on 07/07/2016.
*/
public class TestHistoryListener implements HistoryListener {
private boolean withDetails=true;
private List<HistoryEvent> historyEventLinkedList = new ArrayList<>();
public List<HistoryEvent> getHistoryEventLinkedList() {
return historyEventLinkedList;
}
public void setWithDetails(boolean withDetails) {
this.withDetails = withDetails;
}
@Override
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEventLinkedList.add(newHistoryEvent);
}
@Override
public boolean withDetails() {
return withDetails;
}
}

View file

@ -1,6 +1,9 @@
package org.chtijbug.drools.runtime.impl;
import org.chtijbug.drools.entity.DroolsFactObject;
import org.chtijbug.drools.entity.history.HistoryEvent;
import org.chtijbug.drools.runtime.DroolsChtijbugException;
import org.chtijbug.drools.runtime.listener.HistoryListener;
import org.chtijbug.drools.runtime.resource.FileKnowledgeResource;
import org.junit.Before;
import org.junit.Test;
@ -31,7 +34,17 @@ public class RuleBaseStatefulSessionTestCase {
// TODO Créer une kbase
ruleBase.createKBase(Arrays.asList(fibonacciFile));
// TODO créer une session à partir dela KBase
session = (RuleBaseStatefulSession) ruleBase.createRuleBaseSession();
session = (RuleBaseStatefulSession) ruleBase.createRuleBaseSession(20, new HistoryListener() {
@Override
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
}
@Override
public boolean withDetails() {
return true;
}
});
}
@Test

View file

@ -6,9 +6,8 @@ import org.chtijbug.drools.entity.history.HistoryEvent;
import org.chtijbug.drools.entity.history.fact.DeletedFactHistoryEvent;
import org.chtijbug.drools.entity.history.fact.InsertedFactHistoryEvent;
import org.chtijbug.drools.entity.history.fact.UpdatedFactHistoryEvent;
import org.chtijbug.drools.runtime.RuleBaseBuilder;
import org.chtijbug.drools.runtime.RuleBasePackage;
import org.chtijbug.drools.runtime.RuleBaseSession;
import org.chtijbug.drools.runtime.*;
import org.chtijbug.drools.runtime.listener.HistoryListener;
import org.junit.*;
/**
@ -46,11 +45,11 @@ public class FactHandlerListernerTestTest {
@Test
public void test1ObjectInserted() throws Exception {
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "insert1.drl");
session = ruleBasePackage.createRuleBaseSession();
session = ruleBasePackage.createRuleBaseSession(1000,new TestHistoryListener());
Fibonacci newObject = new Fibonacci(0);
session.insertObject(newObject);
Assert.assertEquals(session.getHistoryContainer().getListHistoryEvent().size(), 1);
HistoryEvent event = session.getHistoryContainer().getListHistoryEvent().get(0);
Assert.assertEquals(session.getHistoryContainer().getListHistoryEvent().size(), 2);
HistoryEvent event = session.getHistoryContainer().getListHistoryEvent().get(1);
if (event instanceof InsertedFactHistoryEvent) {
Assert.assertEquals(1, 1);
Assert.assertEquals(session.getRuleBaseID(), event.getRuleBaseID());
@ -70,13 +69,13 @@ public class FactHandlerListernerTestTest {
@Test
public void test1ObjectUpdated() throws Exception {
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "insert1.drl");
session = ruleBasePackage.createRuleBaseSession();
session = ruleBasePackage.createRuleBaseSession(1000,new TestHistoryListener());
Fibonacci newObject = new Fibonacci(0);
session.insertObject(newObject);
newObject.setValue(100);
session.updateObject(newObject);
Assert.assertEquals(session.getHistoryContainer().getListHistoryEvent().size(), 2);
HistoryEvent event = session.getHistoryContainer().getListHistoryEvent().get(1);
Assert.assertEquals(session.getHistoryContainer().getListHistoryEvent().size(), 3);
HistoryEvent event = session.getHistoryContainer().getListHistoryEvent().get(2);
if (event instanceof UpdatedFactHistoryEvent) {
Assert.assertEquals(1, 1);
Assert.assertEquals(session.getRuleBaseID(), event.getRuleBaseID());
@ -105,12 +104,12 @@ public class FactHandlerListernerTestTest {
@Test
public void retracted() throws Exception {
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "insert1.drl");
session = ruleBasePackage.createRuleBaseSession();
session = ruleBasePackage.createRuleBaseSession(1000,new TestHistoryListener());
Fibonacci newObject = new Fibonacci(0);
session.insertObject(newObject);
session.retractObject(newObject);
Assert.assertEquals(session.getHistoryContainer().getListHistoryEvent().size(), 2);
HistoryEvent event = session.getHistoryContainer().getListHistoryEvent().get(1);
Assert.assertEquals(session.getHistoryContainer().getListHistoryEvent().size(), 3);
HistoryEvent event = session.getHistoryContainer().getListHistoryEvent().get(2);
if (event instanceof DeletedFactHistoryEvent) {
Assert.assertEquals(1, 1);
Assert.assertEquals(session.getRuleBaseID(), event.getRuleBaseID());
@ -130,7 +129,7 @@ public class FactHandlerListernerTestTest {
@Test
public void test1RuleFired() throws Exception {
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "insert1.drl");
session = ruleBasePackage.createRuleBaseSession();
session = ruleBasePackage.createRuleBaseSession(1000,new TestHistoryListener());
session.fireAllRules();
Assert.assertEquals(session.listRules().size(), 1);
Assert.assertEquals(session.listLastVersionObjects().size(), 1);

View file

@ -39,6 +39,11 @@ public class FactHistoryEventTest {
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
@Override
public boolean withDetails() {
return true;
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();
@ -133,6 +138,11 @@ public class FactHistoryEventTest {
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
@Override
public boolean withDetails() {
return true;
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();

View file

@ -42,6 +42,11 @@ public class KnowledgeBaseHistoryEventTest {
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
@Override
public boolean withDetails() {
return true;
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();
@ -75,10 +80,17 @@ public class KnowledgeBaseHistoryEventTest {
final List<HistoryEvent> historyEvents = new ArrayList<HistoryEvent>();
HistoryListener historyListener = new HistoryListener() {
@Override
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
@Override
public boolean withDetails() {
return true;
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();
@ -119,6 +131,9 @@ public class KnowledgeBaseHistoryEventTest {
SessionDisposedEvent sessionDisposedEvent = (SessionDisposedEvent) historyEvents.get(7);
assertThat(sessionDisposedEvent.getRuleBaseID()).isEqualTo(rulePackageID);
assertThat(sessionDisposedEvent.getEventID()).isEqualTo(2);
assertThat(sessionDisposedEvent.getSessionId()).isEqualTo(1);
assertThat(sessionCreatedEvent.getTypeEvent()).isEqualTo(HistoryEvent.TypeEvent.Session);
ruleBaseSession2.dispose();
@ -140,6 +155,11 @@ public class KnowledgeBaseHistoryEventTest {
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
@Override
public boolean withDetails() {
return true;
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();

View file

@ -41,6 +41,11 @@ public class RuleBaseHistoryEventTest {
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
@Override
public boolean withDetails() {
return true;
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(new Long(1L), historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT)", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();

View file

@ -4,10 +4,7 @@ import org.chtijbug.drools.entity.DroolsFactObjectAttribute;
import org.chtijbug.drools.entity.history.HistoryEvent;
import org.chtijbug.drools.entity.history.rule.AfterRuleFiredHistoryEvent;
import org.chtijbug.drools.entity.history.rule.BeforeRuleFiredHistoryEvent;
import org.chtijbug.drools.runtime.DroolsChtijbugException;
import org.chtijbug.drools.runtime.RuleBaseBuilder;
import org.chtijbug.drools.runtime.RuleBasePackage;
import org.chtijbug.drools.runtime.RuleBaseSession;
import org.chtijbug.drools.runtime.*;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
@ -91,7 +88,7 @@ public class RuleHandlerListenerTest {
public void RuleEvent() throws DroolsChtijbugException {
ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(1L, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "infiniteLoop.drl");
session = ruleBasePackage.createRuleBaseSession();
session = ruleBasePackage.createRuleBaseSession(1000,new TestHistoryListener());
Fibonacci newObject = new Fibonacci(0);
session.insertObject(newObject);
@ -101,11 +98,11 @@ public class RuleHandlerListenerTest {
e.printStackTrace();
}
List<HistoryEvent> eventList = session.getHistoryContainer().getListHistoryEvent();
assertThat(eventList).hasSize(6002);
assertThat(eventList).hasSize(3005);
/*
BeforeRuleFiredHistoryEvent
*/
HistoryEvent event1 = eventList.get(1);
HistoryEvent event1 = eventList.get(3);
assertThat(event1).isInstanceOf(BeforeRuleFiredHistoryEvent.class);
BeforeRuleFiredHistoryEvent beforeRuleFiredHistoryEvent = (BeforeRuleFiredHistoryEvent) event1;
assertThat(beforeRuleFiredHistoryEvent.getRule().getRuleName()).isEqualTo("infiniteLoop");
@ -117,7 +114,7 @@ public class RuleHandlerListenerTest {
/*
AfterRuleFiredHistoryEvent
*/
HistoryEvent event3 = eventList.get(3);
HistoryEvent event3 = eventList.get(5);
assertThat(event3).isInstanceOf(AfterRuleFiredHistoryEvent.class);
AfterRuleFiredHistoryEvent afterRuleFiredHistoryEvent = (AfterRuleFiredHistoryEvent) event3;
assertThat(afterRuleFiredHistoryEvent.getRule().getRuleName()).isEqualTo("infiniteLoop");

View file

@ -45,6 +45,11 @@ public class RuleHistoryEventTest {
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
@Override
public boolean withDetails() {
return true;
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(1L, historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "fibonacci.drl");
Long rulePackageID = ruleBasePackage.getRuleBaseID();
@ -85,6 +90,11 @@ public class RuleHistoryEventTest {
public void fireEvent(HistoryEvent newHistoryEvent) throws DroolsChtijbugException {
historyEvents.add(newHistoryEvent);
}
@Override
public boolean withDetails() {
return true;
}
};
RuleBasePackage ruleBasePackage = RuleBaseBuilder.createRuleBasePackage(1L, historyListener, "com.pymmasoftware.test", "fibonacci", "1.0.0_SNAPSHOT", "ruleflow2.drl", "RuleFlowProcess2.bpmn2");
Long rulePackageID = ruleBasePackage.getRuleBaseID();