<html><body><div style="color:#000; background-color:#fff; font-family:times new roman, new york, times, serif;font-size:10pt"><div class="" style="">Thanks for your quick
response. <o:p class="" style=""></o:p></div><div class="" style="">I am using 5.3.0 Final version of Drools. Attached are the
necessary files (DRL, fact, test class) required to reproduce the effect.<o:p class="" style=""></o:p></div><div class="" style="">
</div><div class="" style="">Please let me know if any further details are required.<o:p class="" style=""></o:p></div><div class="" style="color: rgb(0, 0, 0); font-size: 13px; font-family: 'times new roman', 'new york', times, serif; font-style: normal; background-color: transparent;"><br></div><div class="" style="color: rgb(0, 0, 0); font-size: 13px; font-family: 'times new roman', 'new york', times, serif; font-style: normal; background-color: transparent;">Thanks!</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 2:23 PM, Wolfgang Laun <wolfgang.laun@gmail.com> wrote:<br class="" style=""> </font> </div>
<br class="" style=""><br class="" style=""> <div class="" style="">On first reading, both observations could be bugs. But it is difficult to<br clear="none" class="" style="">assess such situation without knowing the Drools version, without<br clear="none" class="" style="">having a complete (but minimal) set of Java and DRL code reproducing<br clear="none" class="" style="">the effect.<br clear="none" class="" style=""><br clear="none" class="" style="">-W<br clear="none" class="" style=""><div class="" id="yqtfd10268" style=""><br clear="none" class="" style="">On 05/06/2014, Sushant Goyal <<a shape="rect" ymailto="mailto:sushantgoyal25@yahoo.co.in" href="mailto:sushantgoyal25@yahoo.co.in" class="" style="">sushantgoyal25@yahoo.co.in</a>> wrote:<br clear="none" class="" style="">> Thanks again for your response Wolfgang.<br clear="none" class="" style="">><br clear="none" class="" style="">> I found one of the explanations on how
Sliding Windows<br clear="none" class="" style="">> operate in Drools while searching for an answer:<br clear="none" class="" style="">> "Events are expired<br clear="none" class="" style="">> from the time window when the clock advances"<br clear="none" class="" style="">><br clear="none" class="" style="">> So, in my case if I am inserting events on T0 (insert 1st event), T1 (insert<br clear="none" class="" style="">> 2nd event), T2 (insert 3rd event) and<br clear="none" class="" style="">> advancing the clock to T3, T4 and T5; 1st event inserted at T0 is<br clear="none" class="" style="">> expired from the window. And the rule calculates the average of the last two<br clear="none" class="" style="">> events (2nd event & 3rd event) falling in the time<br clear="none" class="" style="">> window. And the output average calculated by the from accumulate function<br clear="none" class="" style="">> comes<br
clear="none" class="" style="">> to be (26 +28 / 2 == 27) satisfying the contract of average temperature to<br clear="none" class="" style="">> be above<br clear="none" class="" style="">> the threshold value of 25.<br clear="none" class="" style="">><br clear="none" class="" style="">> Now let's say I do the below (advancing the clock by 5<br clear="none" class="" style="">> minutes after the 3rd insert):<br clear="none" class="" style="">><br clear="none" class="" style="">> T0 (insert 1st event)<br clear="none" class="" style="">> T1 (insert 2st event)<br clear="none" class="" style="">> T2 (insert 3st event)<br clear="none" class="" style="">> T3<br clear="none" class="" style="">> T4<br clear="none" class="" style="">> T5<br clear="none" class="" style="">> T6<br clear="none" class="" style="">> T7<br clear="none" class="" style="">> Fire all rules<br clear="none" class="" style="">><br
clear="none" class="" style="">> The average calculated by the rule is zero (0) since the<br clear="none" class="" style="">> three inserted events fall outside the time window of 5 minutes (as<br clear="none" class="" style="">> expected).<br clear="none" class="" style="">> But, my rule fires regardless of the fact I have the contract of average<br clear="none" class="" style="">> temperature<br clear="none" class="" style="">> to be greater than threshold in my rule :<br clear="none" class="" style="">><br clear="none" class="" style="">> $averageTemp : Number(intValue<br clear="none" class="" style="">>> 25)<br clear="none" class="" style="">> from<br clear="none" class="" style="">> accumulate(SensorReading($temp : temperature)<br clear="none"
class="" style="">> over<br clear="none" class="" style="">> window:time(5m) from<br clear="none" class="" style="">> entry-point "Temperature Reading", average($temp))<br clear="none" class="" style="">><br clear="none" class="" style="">> As per the drools-fusion documentation, over window : time(X) is used to<br clear="none" class="" style="">> consider events that happened in<br clear="none" class="" style="">> the last X units. So, is there something that needs to be changed in my rule<br clear="none" class="" style="">> implementation?<br clear="none" class="" style="">><br clear="none" class="" style="">> One more question here, does over window : time(X) really considers events<br clear="none"
class="" style="">> occurred in the last<br clear="none" class="" style="">> X units. I tried going further by doing the below:<br clear="none" class="" style="">><br clear="none" class="" style="">> T0 (insert 1st event - Sensor reading is 24)<br clear="none" class="" style="">> T1 (insert 2st event - Sensor reading is 26)<br clear="none" class="" style="">> T2 (insert 3st event - Sensor reading is 28)<br clear="none" class="" style="">> T3<br clear="none" class="" style="">> T4<br clear="none" class="" style="">> T5<br clear="none" class="" style="">> T6<br clear="none" class="" style="">> T7<br clear="none" class="" style="">> (insert event - Sensor reading is 30)<br clear="none" class="" style="">> Fire All rules<br clear="none" class="" style="">><br clear="none" class="" style="">> With the above test setup, my rule gets invoked twice printing<br clear="none" class="" style="">> the average of
temperatures as (30) and (30). But using over window:time(5m)<br clear="none" class="" style="">> shouldn't result in rule being triggered once ?<br clear="none" class="" style="">><br clear="none" class="" style="">> Thanks in advance!<br clear="none" class="" style="">><br clear="none" class="" style="">><br clear="none" class="" style="">><br clear="none" class="" style="">> On Thursday, 5 June 2014 12:31 PM, Wolfgang Laun <<a shape="rect" ymailto="mailto:wolfgang.laun@gmail.com" href="mailto:wolfgang.laun@gmail.com" class="" 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="">> 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="">><br clear="none" class="" style="">><br clear="none" class="" style="">> On 04/06/2014, Sushant Goyal <<a shape="rect" ymailto="mailto:sushantgoyal25@yahoo.co.in" href="mailto:sushantgoyal25@yahoo.co.in" class="" 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<br clear="none" class="" style="">>> 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<br clear="none" class="" style="">>> 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<br clear="none" class="" style="">>> 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<br clear="none" class="" style="">>> before<br clear="none" class="" style="">>> and after inserting the 1st event, however, could not notice any<br clear="none" class="" style="">>> 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<br clear="none" class="" style="">>> in<br clear="none" class="" style="">>> time by 1 second (4 min 59 sec instead of 5 minutes) as stated above. But<br clear="none" class="" style="">>> 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 shape="rect" ymailto="mailto:wolfgang.laun@gmail.com" href="mailto:wolfgang.laun@gmail.com" class="" 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 shape="rect" ymailto="mailto:sushantgoyal25@yahoo.co.in" href="mailto:sushantgoyal25@yahoo.co.in" class="" 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<br clear="none" class="" style="">>>> 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<br clear="none" class="" style="">>>> 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<br clear="none" class="" style="">>>> 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="">>>><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 class="" style=""><br class="" style=""></div> </div> </div> </div> </div></body></html>