<html><body><div style="color:#000; background-color:#fff; font-family:times new roman, new york, times, serif;font-size:10pt"><div class="" style=""><span style="font-size: 10pt;">I found one of the explanations on how Sliding Windows
operate in Drools while searching for an answer:</span><br></div><div class="" style=""><o:p class="" style=""></o:p></div><div class="" style="">“<i class="" style="">Events are expired
from the time window when the clock advances</i>”<o:p class="" style=""></o:p></div><div class="" style=""><o:p class="" style=""> </o:p></div><div class="" style="">So, in my case if I am inserting events on T0 (insert 1<sup class="" style="">st</sup>
event), T1 (insert 2<sup class="" style="">nd</sup> event), T2 (insert 3<sup class="" style="">rd</sup> event) and
advancing the clock to T3, T4 and T5; 1<sup class="" style="">st</sup> event inserted at T0 is
expired from the window. And the rule calculates the average of the last two
events (2<sup class="" style="">nd</sup> event & 3<sup class="" style="">rd</sup> event) falling in the time
window. And the output average calculated by the from accumulate function comes
to be (26 +28 / 2 == 27) satisfying the contract of average temperature to be above
the threshold value of 25.<o:p class="" style=""></o:p></div><div class="" style=""><o:p class="" style=""> </o:p></div><div class="" style="">Now let’s say I do the below (advancing the clock by 5
minutes after the 3<sup class="" style="">rd</sup> insert):<o:p class="" style=""></o:p></div><div class="" style=""><o:p class="" style=""> </o:p></div><div class="" style="">T0 (insert 1<sup class="" style="">st</sup> event)<o:p class="" style=""></o:p></div><div class="" style="">T1 (insert 2<sup class="" style="">st</sup> event)<o:p class="" style=""></o:p></div><div class="" style="">T2 (insert 3<sup class="" style="">st</sup> event)<o:p class="" style=""></o:p></div><div class="" style="">T3<o:p class="" style=""></o:p></div><div class="" style="">T4<o:p class="" style=""></o:p></div><div class="" style="">T5<o:p class="" style=""></o:p></div><div class="" style="">T6<o:p class="" style=""></o:p></div><div class="" style="">T7<o:p class="" style=""></o:p></div><div class="" style="">Fire all rules <o:p class="" style=""></o:p></div><div class="" style=""><o:p class="" style=""> </o:p></div><div class="" style="">The average calculated by
the rule is zero (0) since the
three inserted events fall outside the time window of 5 minutes (as expected).
But, my rule fires regardless of the fact I have the contract of average temperature
to be greater than threshold in my rule : <o:p class="" style=""></o:p></div><div class="" style=""><o:p class="" style=""> </o:p></div><div class="" style="">$averageTemp : Number(<b class="" style="">intValue
> 25</b>) <o:p class="" style=""></o:p></div><div class="" style=""> from accumulate(SensorReading($temp : temperature) <o:p class="" style=""></o:p></div><div class="" style=""> over window:time(5m) from
entry-point "Temperature Reading", average($temp))<o:p class="" style=""></o:p></div><div class="" style=""><o:p class="" style=""> </o:p></div><div class="" style="">As per the drools-fusion documentation, <b class="" style="">over window : time(X)</b> is used to consider events that happened in
the last X units. So, is there something that needs to be changed in my rule
implementation?<o:p class="" style=""></o:p></div><div class="" style=""><o:p class="" style=""> </o:p></div><div class="" style="">One more question here, does <b class="" style="">over window : time(X) </b>really considers events occurred in the last
X units. I tried going further by doing the below:<o:p class="" style=""></o:p></div><div class="" style=""><o:p class="" style=""> </o:p></div><div class="" style="">T0 (insert 1<sup class="" style="">st</sup> event – Sensor reading is 24)<o:p class="" style=""></o:p></div><div class="" style="">T1 (insert 2<sup class="" style="">st</sup> event – Sensor reading is 26)<o:p class="" style=""></o:p></div><div class="" style="">T2 (insert 3<sup class="" style="">st</sup> event – Sensor reading is 28)<o:p class="" style=""></o:p></div><div class="" style="">T3<o:p class="" style=""></o:p></div><div class="" style="">T4<o:p class="" style=""></o:p></div><div class="" style="">T5<o:p class="" style=""></o:p></div><div class="" style="">T6<o:p class="" style=""></o:p></div><div class="" style="">T7<o:p class="" style=""></o:p></div><div class="" style="">(insert event – Sensor reading is 30)<o:p class="" style=""></o:p></div><div class=""
style="">Fire All rules<o:p class="" style=""></o:p></div><div class="" style=""><o:p class="" style=""> </o:p></div><div class="" style="">With the above test setup, my rule gets invoked twice printing
the average of temperatures as (30) and (30). But using <b class="" style="">over window:time(5m) </b>shouldn’t result in rule being triggered once ?<o:p class="" style=""></o:p></div><div class="" style=""><o:p class="" style=""> </o:p></div><div class="" style="">Thanks in advance!<o:p class="" style=""></o:p></div><div class="" style=""><span class="" style="">
</span></div><div class="" style=""><o:p class="" style=""> </o:p></div> <div class="qtdSeparateBR"><br><br></div><div class="yahoo_quoted" style="display: block;"> <div style="font-family: times new roman, new york, times, serif; font-size: 10pt;" class=""> <div style="font-family: times new roman, new york, times, serif; font-size: 12pt;" class=""> <div dir="ltr" class="" style=""> <font size="2" face="Arial" class="" style=""> On Thursday, 5 June 2014 1:35 PM, Sushant Goyal <sushantgoyal25@yahoo.co.in> wrote:<br class="" style=""> </font> </div> <br class="" style=""><br class="" style=""> <div class="" style=""><div id="yiv5283390172" class="" style=""><div class="" style=""><div style="color:#000;background-color:#fff;font-family:times new roman, new york, times, serif;font-size:10pt;" class=""><div class="" style="">Thanks again for your response Wolfgang.</div><div class="" style=""> </div><div class="" style="">I found one of
the explanations on how Sliding Windows
operate in Drools while searching for an answer:</div><div class="" style="">“<i class="" style="">Events are expired
from the time window when the clock advances</i>”</div><div class="" style=""> </div><div class="" style="">So, in my case if I am inserting events on T0 (insert 1<sup class="" style="">st</sup>
event), T1 (insert 2<sup class="" style="">nd</sup> event), T2 (insert 3<sup class="" style="">rd</sup> event) and
advancing the clock to T3, T4 and T5; 1<sup class="" style="">st</sup> event inserted at T0 is
expired from the window. And the rule calculates the average of the last two
events (2<sup class="" style="">nd</sup> event & 3<sup class="" style="">rd</sup> event) falling in the time
window. And the output average calculated by the from accumulate function comes
to be (26 +28 / 2 == 27) satisfying the contract of average temperature to be above
the threshold value of 25.</div><div class="" style=""> </div><div class="" style="">Now let’s say I do the below (advancing the clock by 5
minutes after the 3<sup class="" style="">rd</sup> insert):</div><div class="" style=""> </div><div class="" style="">T0 (insert 1<sup class="" style="">st</sup> event)</div><div class="" style="">T1 (insert 2<sup class="" style="">st</sup> event)</div><div class="" style="">T2 (insert 3<sup class="" style="">st</sup> event)</div><div class="" style="">T3</div><div class="" style="">T4</div><div class="" style="">T5</div><div class="" style="">T6</div><div class="" style="">T7</div><div class="" style="">Fire all rules </div><div class="" style=""> </div><div class="" style="">The average calculated by
the rule is zero (0) since the
three inserted events fall outside the time window of 5 minutes (as expected).
But, my rule fires regardless of the fact I have the contract of average temperature
to be greater than threshold in my rule : </div><div class="" style=""> </div><div class="" style="">$averageTemp : Number(<b class="" style="">intValue
> 25</b>) </div><div class="" style=""> from accumulate(SensorReading($temp : temperature) </div><div class="" style=""> over window:time(5m) from
entry-point "Temperature Reading", average($temp))</div><div class="" style=""> </div><div class="" style="">As per the drools-fusion documentation, <b class="" style="">over window : time(X)</b> is used to consider events that happened in
the last X units. So, is there something that needs to be changed in my rule
implementation?</div><div class="" style=""> </div><div class="" style="">One more question here, does <b class="" style="">over window : time(X) </b>really considers events occurred in the last
X units. I tried going further by doing the below:</div><div class="" style=""> </div><div class="" style="">T0 (insert 1<sup class="" style="">st</sup> event – Sensor reading is 24)</div><div class="" style="">T1 (insert 2<sup class="" style="">st</sup> event – Sensor reading is 26)</div><div class="" style="">T2 (insert 3<sup class="" style="">st</sup> event – Sensor reading is 28)</div><div class="" style="">T3</div><div class="" style="">T4</div><div class="" style="">T5</div><div class="" style="">T6</div><div class="" style="">T7</div><div class="" style="">(insert event – Sensor reading is 30)</div><div class="" style="">Fire All rules</div><div class="" style=""> </div><div class="" style="">With the above test setup, my rule gets invoked twice printing
the average of temperatures as (30) and (30). But using <b class="" style="">over window:time(5m) </b>shouldn’t result in rule being triggered once ?</div><div class="" style=""> </div><div class="" style="">Thanks in advance!</div><div class="" style=""><span class="" style="">
</span></div><div class="" style=""> </div> <div class="" style=""><br clear="none" class="" style=""><br clear="none" class="" style=""></div><div class="" id="yiv5283390172yqt68171" style=""><div class="" style="display:block;"> <div class="" style="font-family:times new roman, new york, times, serif;font-size:10pt;"> <div class="" style="font-family:times new roman, new york, times, serif;font-size:12pt;"> <div class="" dir="ltr" style=""> <font class="" size="2" face="Arial" style=""> On Thursday, 5 June 2014 12:31 PM, Wolfgang Laun <wolfgang.laun@gmail.com> wrote:<br clear="none" class="" style=""> </font> </div> <br clear="none" class="" style=""><br clear="none" class="" style=""> <div class="" style="">Computations involving intervals where events arrive in real time<br clear="none" class="" style="">should not depend on differences of one unit of the smalles unit of<br clear="none" class="" style="">time for specifying durations
(here: milliseconds).<br clear="none" class="" style=""><br clear="none" class="" style="">-W<br clear="none" class="" style=""><br clear="none" class="" style=""><br clear="none" class="" style=""><div class="" id="yiv5283390172yqtfd17069" style=""><br clear="none" class="" style="">On 04/06/2014, Sushant Goyal <<a rel="nofollow" shape="rect" class="" ymailto="mailto:sushantgoyal25@yahoo.co.in" target="_blank" href="mailto:sushantgoyal25@yahoo.co.in" style="">sushantgoyal25@yahoo.co.in</a>> wrote:<br clear="none" class="" style="">> Thanks for your response.<br clear="none" class="" style="">> I was under the assumption that the window time frame begins, the moment<br clear="none" class="" style="">> first event is inserted into the working memory. Or I am still missing out<br clear="none" class="" style="">> something here (when you say that the first event is exactly at the<br clear="none" class="" style="">> beginning of the
window)? If I traverse backwards as below, then definitely<br clear="none" class="" style="">> the 1st event lies outside the
window.<br clear="none" class="" style="">><br clear="none" class="" style="">> insert 1st event<br clear="none" class="" style="">> delay 1 minute ^ (4 + 1 = 5)<br clear="none" class="" style="">> insert 2nd event<br clear="none" class="" style="">> delay 1 minute ^ (3 + 1 = 4)<br clear="none" class="" style="">> insert 3rd event<br clear="none" class="" style="">> delay 1 minute ^ (2 + 1 = 3)<br clear="none" class="" style="">> delay 2 minutes ^<br clear="none" class="" style="">> fire all rules<br clear="none" class="" style="">><br clear="none" class="" style="">> However, if I start from the 1st event, the possibility where 1st event lies<br clear="none" class="" style="">> out of time frame of 5 mins would be if certain amount of time is<br clear="none" class="" style="">> consumed while inserting the 1st event. I tried to check
it programmatically<br clear="none" class="" style="">> to see if there is any time lapsed during the insertion of the event by<br clear="none" class="" style="">> printing the clock's current time using clock.getCurrentTime() method before<br clear="none" class="" style="">> and after inserting the 1st event, however, could not notice any difference.<br clear="none" class="" style="">><br clear="none" class="" style="">> But, if I change the time to be advanced by 1 minutes and 59 seconds<br clear="none" class="" style="">> (instead of 2 minutes) towards the end after the three events have been<br clear="none" class="" style="">> inserted, the rule seems to be working fine by considering all the three<br clear="none" class="" style="">> events for calculating the average.<br clear="none" class="" style="">><br clear="none" class="" style="">> I know I am definitely missing out something here as I can see the<br
clear="none" class="" style="">> difference in the behavior of the rule by merely reducing the total delay in<br clear="none" class="" style="">> time by 1 second (4 min 59 sec instead of 5 minutes) as stated above. But I<br clear="none" class="" style="">> am not able to figure that out.<br clear="none" class="" style="">><br clear="none" class="" style="">> Could you please provide more insight.<br clear="none" class="" style="">><br clear="none" class="" style="">> Thanks!<br clear="none" class="" style="">><br clear="none" class="" style="">><br clear="none" class="" style="">> On Wednesday, 4 June 2014 9:01 PM, Wolfgang Laun <<a rel="nofollow" shape="rect" class="" ymailto="mailto:wolfgang.laun@gmail.com" target="_blank" href="mailto:wolfgang.laun@gmail.com" style="">wolfgang.laun@gmail.com</a>><br clear="none" class="" style="">> wrote:<br clear="none" class="" style="">><br clear="none" class=""
style="">><br clear="none" class="" style="">><br clear="none" class="" style="">> Your code does:<br clear="none" class="" style="">> insert 1st event<br clear="none" class="" style="">> delay 1 minute<br clear="none" class="" style="">> insert 2nd event<br clear="none" class="" style="">> delay 1 minute<br clear="none" class="" style="">> insert 3rd event<br clear="none" class="" style="">> delay 1 minute<br clear="none" class="" style="">> delay (1 or) 2 minutes<br clear="none" class="" style="">> fire all rules<br clear="none" class="" style="">><br clear="none" class="" style="">> In the second case, 5 minutes have elapsed since the 1st insert. I<br clear="none" class="" style="">> don't think that this means "that [the 1st insert] falls well within<br clear="none" class="" style="">> the specified time range" - it is exactly at the beginning of
the<br clear="none" class="" style="">>
window, and I'd expect the window to be an interval open at one end -<br clear="none" class="" style="">> otherwise events smack on the point in time "separating" two intervals<br clear="none" class="" style="">> would be in both windows.<br clear="none" class="" style="">><br clear="none" class="" style="">> -W<br clear="none" class="" style="">><br clear="none" class="" style="">><br clear="none" class="" style="">> On 04/06/2014, Sushant Goyal <<a rel="nofollow" shape="rect" class="" ymailto="mailto:sushantgoyal25@yahoo.co.in" target="_blank" href="mailto:sushantgoyal25@yahoo.co.in" style="">sushantgoyal25@yahoo.co.in</a>> wrote:<br clear="none" class="" style="">>> Hi,<br clear="none" class="" style="">>><br clear="none" class="" style="">>> I am<br clear="none" class="" style="">>> trying to understand how Drools can be used to monitor events over a<br clear="none" class="" style="">>>
period<br clear="none" class="" style="">>> of<br clear="none" class="" style="">>> time using Sliding Time Windows. I have created a rule to sound an alarm<br clear="none" class="" style="">>> when<br clear="none" class="" style="">>> average temperature read from a sensor is above 25 degrees (threshold)<br clear="none" class="" style="">>> over<br clear="none" class="" style="">>> a<br clear="none" class="" style="">>> time period of 5 minutes. The rule makes of use of the Stream processing<br clear="none" class="" style="">>> mode so<br clear="none" class="" style="">>> that continuous stream of events could be processed.<br clear="none" class="" style="">>><br clear="none" class="" style="">>> Below<br clear="none" class="" style="">>> is how my rule looks like:<br clear="none" class="" style="">>><br clear="none" class="" style="">>> //declare any global<br
clear="none" class="" style="">>>
variables here<br clear="none" class="" style="">>> globaljava.lang.StringBuilder alertMessage<br clear="none" class="" style="">>><br clear="none" class="" style="">>> // add declaration to<br clear="none" class="" style="">>> change the Fact into an Event<br clear="none" class="" style="">>> declareSensorReading<br clear="none" class="" style="">>> @role(event)<br clear="none" class="" style="">>> end<br clear="none" class="" style="">>><br clear="none" class="" style="">>> /* Alert when average<br clear="none" class="" style="">>> temperature is above 25<br clear="none" class="" style="">>> over a time period of 5 minutes */<br clear="none" class="" style="">>> rule"TemperatureAlarm1"<br clear="none" class="" style="">>><br clear="none" class="" style="">>> when<br clear="none" class="" style="">>>
//conditions<br clear="none" class="" style="">>> $averageTemp : Number(doubleValue ><br clear="none" class="" style="">>> 25.00)<br clear="none" class="" style="">>> fromaccumulate(SensorReading($temp<br clear="none" class="" style="">>> : temperature)<br clear="none" class="" style="">>> over<br clear="none" class="" style="">>> window:time(5m) fromentry-point "Temperature Reading", average($temp))<br clear="none" class="" style="">>> then<br clear="none" class="" style="">>> //actions<br clear="none" class="" style="">>> System.out.println("Fired rule:<br
clear="none" class="" style="">>> "+<br clear="none" class="" style="">>> kcontext.getRule().getName());<br clear="none" class="" style="">>> alertMessage.append("Threshold<br clear="none" class="" style="">>> temperature breached!!"+<br clear="none" class="" style="">>> "\nTurn on the<br clear="none" class="" style="">>> Air Conditioner"+<br clear="none" class="" style="">>> "\nAverage<br clear="none" class="" style="">>> temperature over 5 minutes is above 25 ("+ $averageTemp.intValue() +<br clear="none" class="" style="">>> ")\n");<br clear="none" class="" style="">>><br clear="none" class="" style="">>> end<br clear="none" class="" style="">>><br clear="none"
class="" style="">>> And below<br clear="none" class="" style="">>> is the snapshot of the fact (SensorReading) which is inserted as an event<br clear="none" class="" style="">>> in<br clear="none" class="" style="">>> the working memory:<br clear="none" class="" style="">>><br clear="none" class="" style="">>> publicclassSensorReading {<br clear="none" class="" style="">>><br clear="none" class="" style="">>> privatedoubletemperature;<br clear="none" class="" style="">>><br clear="none" class="" style="">>> publicSensorReading(){}<br clear="none" class="" style="">>><br clear="none" class="" style="">>> publicSensorReading(doubletemp){<br clear="none" class="" style="">>> this.temperature= temp;<br clear="none" class="" style="">>>
}<br clear="none" class="" style="">>><br clear="none" class="" style="">>> // getters and setters<br clear="none" class="" style="">>> }<br clear="none" class="" style="">>><br clear="none" class="" style="">>><br clear="none" class="" style="">>> In<br clear="none" class="" style="">>> order to test the rule, I am using Pseudo Clock with Stream processing<br clear="none" class="" style="">>> turned<br clear="none" class="" style="">>> on. I am inserting three SensorReading objects in the working memory with<br clear="none" class="" style="">>> temperature<br clear="none" class="" style="">>> values as (24, 26, 28) after every minute, so that the average of the<br clear="none" class="" style="">>> temperatures is above threshold and the rule is invoked. After the objects<br clear="none" class="" style="">>> are<br clear="none"
class="" style="">>> inserted in the working memory, I am deliberately advancing the Pseudo<br clear="none" class="" style="">>> clock<br clear="none" class="" style="">>> by<br clear="none" class="" style="">>> another 1 minute, so that the total time elapsed is 4 minutes. The rule<br clear="none" class="" style="">>> works<br clear="none" class="" style="">>> as expected with the above test setup and prints the average value as 26<br clear="none" class="" style="">>> on<br clear="none" class="" style="">>> the<br clear="none" class="" style="">>> console.<br clear="none" class="" style="">>><br clear="none" class="" style="">>> However,<br clear="none" class="" style="">>> if I advance the clock by 2 minutes instead of 1 minute after three sensor<br clear="none" class="" style="">>> reading objects have been inserted in the working memory (after every 1<br clear="none"
class="" style="">>> minute<br clear="none" class="" style="">>> interval), the rule gets invoked but the average value gets changed to 27<br clear="none" class="" style="">>> (26 +<br clear="none" class="" style="">>> 28 / 2 == 27). Looks like the first temperature reading is getting ignored<br clear="none" class="" style="">>> by<br clear="none" class="" style="">>> the rule despite the fact that it falls well within the specified time<br clear="none" class="" style="">>> range<br clear="none" class="" style="">>> of<br clear="none" class="" style="">>> 5 minutes. Below is the snapshot of my test class:<br clear="none" class="" style="">>><br clear="none" class="" style="">>> publicclassTemperatureAlarmTest<br clear="none" class="" style="">>> {<br clear="none" class="" style="">>><br clear="none" class="" style="">>> staticKnowledgeBase
kbase;<br clear="none" class="" style="">>> staticStatefulKnowledgeSession ksession;<br clear="none" class="" style="">>> staticKnowledgeRuntimeLogger logger;<br clear="none" class="" style="">>> staticSessionPseudoClock clock;<br clear="none" class="" style="">>><br clear="none" class="" style="">>> @BeforeClass<br clear="none" class="" style="">>> publicstaticvoidsetupKsession() {<br clear="none" class="" style="">>> try{<br clear="none" class="" style="">>> // load up the<br clear="none" class="" style="">>> knowledge base<br clear="none" class="" style="">>>
kbase= readKnowledgeBase();<br clear="none" class="" style="">>> ksession= readKnowldedeSession(kbase);<br clear="none" class="" style="">>> clock= ksession.getSessionClock();<br clear="none" class="" style="">>><br clear="none" class="" style="">>> logger=<br clear="none" class="" style="">>> KnowledgeRuntimeLoggerFactory.newThreadedFileLogger(ksession,<br clear="none" class="" style="">>> "log/Errors",<br clear="none" class="" style="">>> 500);<br clear="none" class="" style="">>><br clear="none" class="" style="">>> } catch(Throwable t) {<br clear="none" class="" style="">>>
t.printStackTrace();<br clear="none" class="" style="">>> }<br clear="none" class="" style="">>> }<br clear="none" class="" style="">>><br clear="none" class="" style="">>> /**<br clear="none" class="" style="">>> *<br clear="none" class="" style="">>> Create a new Stateful knowledge Session with a pseudo clock from the<br clear="none" class="" style="">>> *<br clear="none" class="" style="">>> knowledge base<br clear="none" class="" style="">>> *<br clear="none" class="" style="">>> * @paramkbase<br clear="none" class="" style="">>> * @return<br clear="none" class="" style="">>> *
@throwsException<br clear="none" class="" style="">>> */<br clear="none" class="" style="">>> privatestaticStatefulKnowledgeSession readKnowldedeSession(<br clear="none" class="" style="">>> KnowledgeBase kbase) throwsException {<br clear="none" class="" style="">>><br clear="none" class="" style="">>> // Knowledge Session Configuration<br clear="none" class="" style="">>> KnowledgeSessionConfiguration<br clear="none" class="" style="">>> config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();<br clear="none" class="" style="">>> config.setOption(ClockTypeOption.get("pseudo"));<br clear="none" class=""
style="">>> returnkbase.newStatefulKnowledgeSession(config, null);<br clear="none" class="" style="">>><br clear="none" class="" style="">>> }<br clear="none" class="" style="">>><br clear="none" class="" style="">>> @AfterClass<br clear="none" class="" style="">>> publicstaticvoidcloseKsession() {<br clear="none" class="" style="">>> try{<br clear="none" class="" style="">>> // load up the<br clear="none" class="" style="">>> knowledge base<br clear="none" class="" style="">>> logger.close();<br clear="none" class="" style="">>>
ksession.dispose();<br clear="none" class="" style="">>><br clear="none" class="" style="">>> } catch(Throwable t) {<br clear="none" class="" style="">>> t.printStackTrace();<br clear="none" class="" style="">>> }<br clear="none" class="" style="">>> }<br clear="none" class="" style="">>><br clear="none" class="" style="">>> @Test<br clear="none" class="" style="">>> publicvoidTemperatureAlarm1_Test() {<br clear="none" class="" style="">>><br clear="none" class="" style="">>> // Create Temperature list<br clear="none" class="" style="">>>
ArrayList<SensorReading><br clear="none" class="" style="">>> tempMetrics = newArrayList<SensorReading>();<br clear="none" class="" style="">>> doubletemp = 24.00;<br clear="none" class="" style="">>><br clear="none" class="" style="">>> while(tempMetrics.size()<br clear="none" class="" style="">>> < 3) {<br clear="none" class="" style="">>> tempMetrics.add(newSensorReading(temp));<br clear="none" class="" style="">>> temp += 2;<br clear="none" class="" style="">>> }<br clear="none" class="" style="">>>
System.out.println("Size of<br clear="none" class="" style="">>> tempMetrics List: "+tempMetrics.size()+"\n");<br clear="none" class="" style="">>> System.out.println("First Temp<br clear="none" class="" style="">>> reading: "+tempMetrics.get(0).getTemperature());<br clear="none" class="" style="">>> System.out.println("Second Temp<br clear="none" class="" style="">>> reading: "+tempMetrics.get(1).getTemperature());<br clear="none" class="" style="">>> System.out.println("Third Temp<br clear="none" class="" style="">>> reading: "+tempMetrics.get(2).getTemperature()+"\n");<br clear="none" class="" style="">>><br clear="none" class="" style="">>> // Separate stream for inserts<br clear="none" class=""
style="">>> WorkingMemoryEntryPoint<br clear="none" class="" style="">>> temperatureStream = ksession.getWorkingMemoryEntryPoint( "Temperature<br clear="none" class="" style="">>> Reading");<br clear="none" class="" style="">>><br clear="none" class="" style="">>> // Create fact handle list<br clear="none" class="" style="">>> ArrayList<FactHandle><br clear="none" class="" style="">>> factHandleList = newArrayList<FactHandle>();<br clear="none" class="" style="">>><br clear="none" class="" style="">>> // Insert objects into working<br clear="none" class="" style="">>> memory while advancing the clock<br clear="none" class="" style="">>>
for(inti = 0; i <<br clear="none" class="" style="">>> tempMetrics.size(); i++) {<br clear="none" class="" style="">>><br clear="none" class="" style="">>> factHandleList.add(temperatureStream.insert(tempMetrics.get(i)));<br clear="none" class="" style="">>> clock.advanceTime(1,<br clear="none" class="" style="">>> TimeUnit.MINUTES);<br clear="none" class="" style="">>> System.out.println("Time advances<br clear="none" class="" style="">>> by 1 minute");<br clear="none" class="" style="">>> }<br clear="none" class="" style="">>> System.out.println("Fact Count<br clear="none" class="" style="">>> is: "+temperatureStream.getFactCount());<br
clear="none" class="" style="">>> System.out.println("Fact Entry<br clear="none" class="" style="">>> Point is: "+temperatureStream.getEntryPointId());<br clear="none" class="" style="">>> System.out.println("Size of<br clear="none" class="" style="">>> FactHandleList: "+factHandleList.size()+"\n");<br clear="none" class="" style="">>><br clear="none" class="" style="">>> clock.advanceTime(1,<br clear="none" class="" style="">>> TimeUnit.MINUTES); //change in<br clear="none" class="" style="">>> advanced time alters the rule behavior<br clear="none" class="" style="">>><br clear="none" class="" style="">>> StringBuilder stringBuilder = newStringBuilder();<br clear="none"
class="" style="">>> ksession.setGlobal("alertMessage", stringBuilder);<br clear="none" class="" style="">>> ksession.fireAllRules();<br clear="none" class="" style="">>><br clear="none" class="" style="">>> // Remove facts<br clear="none" class="" style="">>> for(inti = 0; i <<br clear="none" class="" style="">>> factHandleList.size(); i++) {<br clear="none" class="" style="">>> temperatureStream.retract(factHandleList.get(i));<br clear="none" class="" style="">>> }<br clear="none" class="" style="">>> System.out.println("After<br
clear="none" class="" style="">>> Removing facts");<br clear="none" class="" style="">>> System.out.println("Fact Count<br clear="none" class="" style="">>> is: "+temperatureStream.getFactCount());<br clear="none" class="" style="">>><br clear="none" class="" style="">>> String result =<br clear="none" class="" style="">>> stringBuilder.substring(0, 32);<br clear="none" class="" style="">>> System.out.println("Alert Message<br clear="none" class="" style="">>> is: \n"+ stringBuilder.toString());<br clear="none" class="" style="">>> assertEquals("Alert Message<br clear="none" class="" style="">>> is: ", "Threshold<br clear="none" class="" style="">>> temperature breached!!", result);<br
clear="none" class="" style="">>> }<br clear="none" class="" style="">>><br clear="none" class="" style="">>> /**<br clear="none" class="" style="">>> *<br clear="none" class="" style="">>> Create the knowledge base with stream processing turned on.<br clear="none" class="" style="">>> *<br clear="none" class="" style="">>> * @return<br clear="none" class="" style="">>> * @throwsException<br clear="none" class="" style="">>> */<br clear="none" class="" style="">>> privatestaticKnowledgeBase<br clear="none" class="" style="">>> readKnowledgeBase() throwsException {<br clear="none" class="" style="">>> KnowledgeBuilder
kbuilder =<br clear="none" class="" style="">>> KnowledgeBuilderFactory.newKnowledgeBuilder();<br clear="none" class="" style="">>><br clear="none" class="" style="">>> kbuilder.add(ResourceFactory.newClassPathResource("TemperatureAlarm1.drl"),ResourceType.DRL);<br clear="none" class="" style="">>> hasErrors(kbuilder);<br clear="none" class="" style="">>><br clear="none" class="" style="">>> // Stream processing turned on<br clear="none" class="" style="">>> KnowledgeBaseConfiguration conf =<br clear="none" class="" style="">>> KnowledgeBaseFactory.newKnowledgeBaseConfiguration();<br clear="none" class="" style="">>> conf.setOption(EventProcessingOption.STREAM);<br clear="none" class=""
style="">>> KnowledgeBase kbase =<br clear="none" class="" style="">>> KnowledgeBaseFactory.newKnowledgeBase(conf);<br clear="none" class="" style="">>> hasErrors(kbuilder);<br clear="none" class="" style="">>> kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());<br clear="none" class="" style="">>><br clear="none" class="" style="">>> returnkbase;<br clear="none" class="" style="">>> }<br clear="none" class="" style="">>><br clear="none" class="" style="">>> /**<br clear="none" class="" style="">>> *<br clear="none" class="" style="">>> Report errors if any<br clear="none" class="" style="">>>
*<br clear="none" class="" style="">>> * @paramkbuilder<br clear="none" class="" style="">>> * @throwsException<br clear="none" class="" style="">>> */<br clear="none" class="" style="">>> privatestaticvoidhasErrors(KnowledgeBuilder kbuilder)<br clear="none" class="" style="">>> throwsException<br clear="none" class="" style="">>> {<br clear="none" class="" style="">>> KnowledgeBuilderErrors errors =<br clear="none" class="" style="">>> kbuilder.getErrors();<br clear="none" class="" style="">>> if(errors.size() > 0) {<br clear="none" class="" style="">>> for(KnowledgeBuilderError error :
errors) {<br clear="none" class="" style="">>> System.err.println(error);<br clear="none" class="" style="">>> }<br clear="none" class="" style="">>> thrownewIllegalArgumentException("Could not parse<br clear="none" class="" style="">>> knowledge.");<br clear="none" class="" style="">>> }<br clear="none" class="" style="">>><br clear="none" class="" style="">>> }<br clear="none" class="" style="">>><br clear="none" class="" style="">>> }<br clear="none" class="" style="">>><br clear="none" class="" style="">>><br clear="none" class="" style="">>> Could<br
clear="none" class="" style="">>> anyone please help explain this change in the behavior of the rule?<br clear="none" class="" style="">>><br clear="none" class="" style="">>> Regards,<br clear="none" class="" style="">>> Sushant<br clear="none" class="" style=""></div><br clear="none" class="" style=""><br clear="none" class="" style=""></div> </div> </div> </div></div> </div></div></div><br class="" style=""><br class="" style=""></div> </div> </div> </div> </div></body></html>