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