Tim
Tim

Reputation: 437

Drools Rule Language: rule not always fired

I'm new to Drools Fusion and I'm trying to figure out why my rule isn't always fired. I'm using Drools 6.3. These are the events I'm inserting:

    private static void initMessageObject() {
    SessionPseudoClock clock = ksession.getSessionClock();

    hellodrools2.AppInfo app = new hellodrools2.AppInfo();
    entryPoint1.insert(app);
    System.out.println(app);

    Steps step1 = new Steps(25, 0);
    entryPoint1.insert(step1);

    clock.advanceTime(30, TimeUnit.MINUTES);

    Steps step2 = new Steps(15, 0);
    entryPoint1.insert(step2);

    clock.advanceTime(15, TimeUnit.MINUTES);

    Steps step3 = new Steps(25, 0);
    entryPoint1.insert(step3);

    try {
        System.err.println("[[ Sleeping ...]]");
        Thread.sleep(5000);
    } catch (final InterruptedException e) {
        e.printStackTrace();
    }
    System.err.println("[[ awake ...]]");

    ksession.halt();
    ksession.dispose();
}

And this is my rule file:

import hellodrools.Steps
import hellodrools.AppInfo

declare Steps
    @role(event)
end

rule "STEPS RULE"
when
    $totalSteps : Number( doubleValue < 50 ) from accumulate(
        Steps( stepsCount : steps ) over window:time( 1h ) from entry-point
       entryone, sum( stepsCount ) )
then
    System.out.println("STEPS RULE: get moving!");
    System.out.println($totalSteps);
end

This is my output:

AppInfo{startTime=Sat Feb 27 21:30:42 CET 2016}
[[ Sleeping ...]]
STEPS RULE: get moving!
0.0
[[ awake ...]]

I would expect that my rule would fire 2 times and give the following output:

AppInfo{startTime=Sat Feb 27 21:30:42 CET 2016}
[[ Sleeping ...]]
STEPS RULE: get moving!
25.0
STEPS RULE: get moving!
40.0
[[ awake ...]]

I'm probably overlooking some things but I didn't find much information on my problem. Could someone explain what is happening here exactly? Thank you.

Upvotes: 0

Views: 464

Answers (1)

laune
laune

Reputation: 31290

There are two good ways of running event processing with Drools.

One is to run a session in a thread, calling fireUntilHalt, while using a real-time clock. In production mode, events will arrive and be inserted; for testing, simulate with a thread running a script for inserting event facts and pausing to let real time go by (having replaced minutes by seconds).

The other one, well suited for testing, uses a pseudo-clock and a sequence of event facts with their time stamps (separate or as an attribute), executing the triple

clock.advance( ...event.timestamp - clock.getCurrentTime()... );
wmep.insert( event );
ksession.fireAllRules();

repeatedly for each event. This should work for versions 5.5 and later, producing the result you expect.

Upvotes: 1

Related Questions