Hi guys,
the drools fusion documentation states that
"One of the benefits of running the engine in STREAM
mode is that the engine can detect when an event can no longer
match any rule due to its temporal constraints. When that happens,
the engine can safely retract the event from the session without
side effects and release any resources used by that event."
I have a hard time understanding why my events do not get removed.
In the following example I have following rules running in stream
mode:
----------------------------------------------------------------------------------------------------------------------------
package rules
import java.util.logging.Logger
declare GenericEvent
@role(event)
playerIndex : long
eventName : String
card : String
chosenSuit : String
end
declare Table
currentPlayerIndex : long
topCard : String
end
rule "new table"
when
not Table()
then
insert(new Table(0,"a"));
end
rule "discardChoosing"
when
$event : GenericEvent(eventName=="discardCard", $playerIndex :
playerIndex, card.equals("c")) from entry-point "my stream"
$table : Table(currentPlayerIndex==$playerIndex,
!topCard.equals("c"))
then
Logger.getLogger("####").info("discardChoosing FIRED");
modify($table) {setTopCard("c")};
end
rule "choosingSuit"
no-loop
when
$event : GenericEvent(eventName=="choosingSuit", $playerIndex :
playerIndex, $chosenSuit : chosenSuit) from entry-point "my stream"
$table : Table(currentPlayerIndex==$playerIndex)
$discardCardEvent : GenericEvent(eventName=="discardCard",
playerIndex==$playerIndex, card.equals("c")) from entry-point "my
stream"
then
Logger.getLogger("####").info("choosingSuit FIRED");
modify($table)
{setCurrentPlayerIndex($table.getCurrentPlayerIndex() + 1)};
end
rule "previousPlayer"
when
$event : GenericEvent(eventName=="previousPlayer") from
entry-point "my stream"
$table : Table()
then
Logger.getLogger("####").info("previousPlayer FIRED");
modify($table)
{setCurrentPlayerIndex($table.getCurrentPlayerIndex() - 1)};
end
----------------------------------------------------------------------------------------------------------------------------
I would expect after inserting "discardCard" followed by
"choosingSuit" event, both should be retracted as their conditions
do not evaluate to true anymore. But even after sleeping a couple of
seconds, the rule "choosingSuit" fires again, which means to me the
events are still in working memory. Here is the log output:
inserting GenericEvent( playerIndex=0, eventName=discardCard,
card=c, chosenSuit=null )
INFO: discardChoosing FIRED
INFO: choosingSuit FIRED
inserting GenericEvent( playerIndex=0, eventName=choosingSuit,
card=null, chosenSuit=HEARTS )
Sleeping 9 seconds...
Sleeping done. Printing facts:
Fact handle: [fact 0:2:1690464956:1690464956:5:DEFAULT:Table(
currentPlayerIndex=1, topCard=c )]
inserting GenericEvent( playerIndex=0, eventName=previousPlayer,
card=null, chosenSuit=null )
INFO: previousPlayer FIRED
INFO: choosingSuit FIRED
INFO: previousPlayer FIRED
INFO: choosingSuit FIRED
INFO: previousPlayer FIRED
INFO: choosingSuit FIRED
INFO: previousPlayer FIRED
INFO: choosingSuit FIRED
INFO: previousPlayer FIRED
...
I'm running Drools 5.4 and inserting/executing in this way:
List cmds = new ArrayList();
cmds.add(CommandFactory.newInsert(discard, "event", false, "my
stream"));
cmds.add(CommandFactory.newFireAllRules(20));
System.out.println("inserting " + discard);
ksession.execute(CommandFactory.newBatchExecution(cmds));
Any help is highly appreciated.