[rules-users] CEP Question

Glenn Macgregor gmacgregor at pocketkings.ie
Tue Feb 16 09:25:42 EST 2010


Hi Again,

After some digging I still have a couple of question regarding CEP events and windows in a testing environment.

Rules:

declare ParameterUpdateEvent
      @role(event)
end

rule "Set Parameter Value"
      when
            ParameterUpdateEvent($name : name, $newParamValue : value)
                  from entry-point "ParamUpdateStream"
            $param : Parameter(name == $name)
      then
            $param.setValue($newParamValue);
            System.out.println("New value = " + $param.getValue());
end

rule "Print Average"
      when
            ParameterUpdateEvent($paramName : name, $newParamValue : value)
                  from entry-point "ParamUpdateStream"
            $param : Parameter(name == $paramName)
            $averageUpdateValue : Number(doubleValue >= 1) from accumulate(
                  ParameterUpdateEvent(name == $paramName, $value : value)
                  over window:length( 5 )
                  from entry-point "ParamUpdateStream", average($value))

            #Number($averageUpdateValue : doubleValue)
      then
            #System.out.println("Here");
            System.out.println("Average update value for " + $paramName +
                  " = " + $averageUpdateValue);
end


*         Declare the ParameterUpdateEvent

*         Rule to update the parameter in working memory with the value in the event: "Set Parameter Value"

*         Rule to print an average over 5 updates.

As you can see I define the window as a length of 5 so I would expect to have 5 updates events at any given time, and I do when I don't use a pseudo clock in my test.

Test with no pseudo clock:

*         Add 56 - Average output is 56.0

*         Add 89 - Average output is 72.5

*         Add 3 - Average output is 49.33

*         Add 50 - Average output is 49.5

*         Add 90 - Average output is 57.6

As I am still learning about Drools and CEP within Drools the next step I took was to associate a pseudo clock with the session:

KnowledgeSessionConfiguration config =
                  KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
            config.setOption(ClockTypeOption.get("pseudo"));

            mSession = mKnowledgeBase.newStatefulKnowledgeSession(config, null);
mClock = (SessionPseudoClock)mSession.getSessionClock();

And then increment the time before each event insert:
mClock.advanceTime(1, TimeUnit.SECONDS);

I am not sure why that has an effect because my window is still defined as length based so time should not be a factory at all. What I am seeing is:

*         Add 56 - Average output is 56.0

*         Add 89 - Average output is 89.0

*         Add 3 - Average output is 3.0

*         Add 50 - Average output is 50.0

*         Add 90 - Average output is 90.0

>From the above, and the logging output which states the previous event is retracted when the next event is inserted, this does not seem to be using the sliding window. Why does adding the advanceTime call cause this to happen. At the end of the day these rules do need to be time based and I do need to test them using JUnit.

Thanks

 Glenn


From: rules-users-bounces at lists.jboss.org [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Glenn Macgregor
Sent: 16 February 2010 10:32
To: Rules Users List
Subject: Re: [rules-users] CEP Question

Please ignore my last message, sent by mistake!

Sorry for the confusion.

 Glenn

From: rules-users-bounces at lists.jboss.org [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Edson Tirelli
Sent: 15 February 2010 20:08
To: Rules Users List
Subject: Re: [rules-users] CEP Question


   Hi Glen,

   The averages are indeed recalculated on event expiration. Example:

You have values for the following events:

e1: 20
e2: 30
e3: 40

    So the average is 30. Whenever e1 is expired in your window, the average is recalculated to 35 (assuming no new event arrived).

    What are you seeing there?

    Edson
2010/2/15 Glenn Macgregor <gmacgregor at pocketkings.ie<mailto:gmacgregor at pocketkings.ie>>
Hi All,

I am still working through a CEP use case which is going fairly well. I have a few rules and it seems they are working as I expect. Is there a way to get called back when events go out of a time window? My current use case is alerting, I have a stream of events (param updates) coming in and I create a ParamUpdateEvent for each. I have a rule which averages the values in the ParamUpdateEvent and tests against a threshold, that is working fine. The problem is when I don't receive any events for a period of time over the window size I really want to the rule which calculates the average to fire when anything is moved out of the window as well as when an update arrives, is this possible?

Thanks

 Glenn

_______________________________________________
rules-users mailing list
rules-users at lists.jboss.org<mailto:rules-users at lists.jboss.org>
https://lists.jboss.org/mailman/listinfo/rules-users



--
 Edson Tirelli
 JBoss Drools Core Development
 JBoss by Red Hat @ www.jboss.com<http://www.jboss.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20100216/b60f3b54/attachment.html 


More information about the rules-users mailing list