Hello,
I am trying to make a rule to delay
firing until a certain amount of time has passed without another event being
received. I have set up a loop that goes every 10 seconds in my main
application that takes readings and injects them into the ReadingStream. These
are like sensor readings.
I have a thread started at
initialization that is basically calling fireUntilHalt() and I never call halt
until shutdown, and that seams to be working fine.
So basically any time an out of spec
reading in my Reading object (<15) is received, I want to wait to see if a
FollowUpReading is not received in the next 5 seconds, before I fire the
results(The second rule below). The first rule is there just to verify I
am indeed detecting NumReadings with values < 15 being injected and that
works fine. Now at this point in my appication I am *never* inserting a FollowUpReading
object/event, so I would expect the 2nd rule to fire all the time,
however the strange thing is that it only fires the first time I receive a
reading out of spec. I see rule one fire, then the seond time, but after that
any subsequent out of spec readings received(I know they are out of spec,
because rule 1 still fires when received) but rule 2 never fires again. It
only ever fires one time! This is very confusing. These ar
the only 2 rules and the only two object types being inserted to the stream. Know
that rule 2 *can* fire because it
does once and only once. Why won’t it fire beyond the first time,
even though I never insert the FollowUpReading() ?
Thanks,
Chris
declare NumReading
@role(
event )
end
declare FollowUpReading
@role(event)
end
rule "Determine out of
spec reading"
when
$n
: NumReading($r:reading < 15) from entry-point "ReadingStream";
then
System.err.println("Fire
off a follow up reading for device: " + $n);
end
rule "Missed degrading
confirmation reading"
when
$n
: NumReading($r:reading < 15) from entry-point "ReadingStream";
not
(FollowUpReading(this after[0s, 5s] $n))
then
System.err.println("No
good reading received for: " + $n);
end