[rules-users] Trying to get Sliding Windows to work

Edson Tirelli tirelli at post.com
Thu Apr 2 09:35:06 EDT 2009


   Declare your fact type with @role( event ).

2009/4/2 Nestor Tarin Burriel <nestabur at gmail.com>

> And how can I create events from guvnor?
>
> 2009/4/2 Edson Tirelli <tirelli at post.com>
>
>
>>    Need to fix the error message, but it seems you are trying to use the
>> sliding window on regular facts... sliding window only makes sense for
>> events...
>>
>>    Also, the property you are using to set the event processing mode seems
>> wrong. Check here:
>>
>>
>> https://hudson.jboss.org/hudson/job/drools/lastSuccessfulBuild/artifact/trunk/target/docs/drools-fusion/html/ch02.html#d0e1067
>>
>>     []s
>>     Edson
>>
>> 2009/4/2 nestabur <nestabur at gmail.com>
>>
>>
>>>
>>> Hi All,
>>>
>>> I'm trying to use sliding windows with guvnor, I deploy the package in my
>>> rule engine as:
>>>
>>>               Properties props = new Properties();
>>>                props.put("url", rulePackagePath);
>>>                props.put("eventProcessingMode", "stream");
>>>
>>>                agent = RuleAgent.newRuleAgent(props);
>>>                session = agent.getRuleBase().newStatefulSession();
>>>
>>> When I insert a fact into the working memory as:
>>>                session.insert(fact);
>>>                session.fireAllRules();
>>>
>>> I get the following error:
>>>
>>> Exception while processing message: java.lang.ClassCastException:
>>> org.drools.common.DefaultFactHandle cannot be cast to
>>> org.drools.common.EventFactHandle
>>> java.lang.ClassCastException: org.drools.common.DefaultFactHandle cannot
>>> be
>>> cast to org.drools.common.EventFactHandle
>>>        at
>>>
>>> org.drools.rule.SlidingTimeWindow.updateNextExpiration(SlidingTimeWindow.java:192)
>>>        at
>>>
>>> org.drools.rule.SlidingTimeWindow.assertRightTuple(SlidingTimeWindow.java:119)
>>>        at
>>> org.drools.rule.BehaviorManager.assertRightTuple(BehaviorManager.java:87)
>>>        at org.drools.reteoo.ExistsNode.assertObject(ExistsNode.java:172)
>>>        at
>>>
>>> org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:366)
>>>        at
>>>
>>> org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:349)
>>>        at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:147)
>>>        at
>>>
>>> org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:42)
>>>        at
>>> org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:184)
>>>        at
>>> org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:146)
>>>        at
>>>
>>> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:1066)
>>>        at
>>>
>>> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:1022)
>>>        at
>>>
>>> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:810)
>>>        at
>>>
>>> com.s2grupo.triton.service.impl.CorrelatorServiceImpl.insertFact(CorrelatorServiceImpl.java:64)
>>>        at
>>>
>>> com.s2grupo.triton.jms.impl.JmsMessageListenerImpl.onMessage(JmsMessageListenerImpl.java:67)
>>>        at
>>>
>>> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1021)
>>>        at
>>>
>>> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:122)
>>>        at
>>>
>>> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:192)
>>>        at
>>>
>>> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:122)
>>>        at
>>>
>>> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:43)
>>>        at
>>>
>>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>>>        at
>>>
>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>>>        at java.lang.Thread.run(Thread.java:619)
>>>
>>> What I'm missing? Is it a bug? I'm using the 5.0.0.SNAPSHOT version of
>>> drools.
>>>
>>> Thanks,
>>>
>>> NEStor
>>>
>>>
>>> ober0n wrote:
>>> >
>>> > Hi Ed, thanks for the quick reply, I will try the temporal constraints
>>> as
>>> > well.
>>> >
>>> > I haven't completed my testing yet but the sliding windows seems to be
>>> > working. Thanks!
>>> >
>>> > I am getting a strange problem of my program hanging. It gets all the
>>> way
>>> > past my "dispose()" of the StatefulKnowledgeSession and closing the
>>> > session logger and to the end of my main(). Then it just sits there.
>>> I'm
>>> > thinking it's a bug in my rules but wanted to make sure this wasn't a
>>> > feature of Streams (maybe some thread kicked off to accept facts or
>>> > something).
>>> >
>>> > If you could just confirm nothing in Drools fusion is supposed to
>>> continue
>>> > running, that would be great.
>>> >
>>> > Here are the significant snippets of my code:
>>> >               ...
>>> >               WorkingMemoryEntryPoint eventStream =
>>> > ksession.getWorkingMemoryEntryPoint( "EventStream" );
>>> >               ...
>>> >               eventStream.insert(goodbye_message);
>>> >               Thread.sleep(10000);
>>> >               eventStream.insert(hello_message);
>>> >               ksession.fireAllRules();
>>> >               ksession.dispose();
>>> >               logger.close();
>>> >       } catch (Throwable t) {
>>> >               t.printStackTrace();
>>> >       }
>>> > } // end main()  <-- tracing through the code, I get past the end of
>>> > main() then see a "Source not found." in the Eclipse debugger which
>>> seems
>>> > to be looking for "Thread.exit() line: 604"
>>> >
>>> >
>>> > The updated rule:
>>> >
>>> > declare Message
>>> >     @role( event )
>>> > end
>>> >
>>> > rule "Hello World"
>>> >       when
>>> >               Message( status == Message.HELLO ) from entry-point
>>> "EventStream"
>>> >               exists(Message( status == Message.GOODBYE ) over
>>> window:time( 4s )  from
>>> > entry-point "EventStream")
>>> >       then
>>> >
>>> >
>>> System.out.println("**************************************************");
>>> >               System.out.println( "There was a GOODBYE message near the
>>> HELLO
>>> > message." );
>>> >
>>> >
>>> System.out.println("**************************************************");
>>> > end
>>> >
>>> > Thanks.
>>> >
>>> >
>>> > Edson Tirelli-3 wrote:
>>> >>
>>> >>     Although your rule should work, the best way to write your rule
>>> would
>>> >> be
>>> >> using temporal constraints instead of sliding windows:
>>> >>
>>> >> rule "Goodbye before Hello World"
>>> >>        when
>>> >>                $m : Message( status == Message.HELLO )
>>> >>                exists( Message( status == Message.GOODBYE, this
>>> >> before[0s,3s] $m ) )
>>> >>        then
>>> >>                System.out.println( "There was a GOODBYE message before
>>> >> the
>>> >> HELLO
>>> >> message." );
>>> >> end
>>> >>
>>> >>     Using "before" operator is not only much cheaper (in terms of used
>>> >> resources) than sliding windows, but it also allow the engine to
>>> reason
>>> >> over
>>> >> the temporal constraints looking for special cases, like when you use
>>> >> negative patterns.
>>> >>
>>> >>     I will look further into your case to check if I missed anything
>>> on
>>> >> the
>>> >> sliding windows support, but using STREAM mode should work.
>>> >>
>>> >>     If you can open a JIRA for me to raise a compilation error when
>>> >> compiling sliding windows using CLOUD mode, I appreciate. This will
>>> allow
>>> >> you to follow up my progress.
>>> >>
>>> >>     []s
>>> >>     Edson
>>> >>
>>> >>
>>> >> 2009/3/30 ober0n <lili339 at hotmail.com>
>>> >>
>>> >>>
>>> >>> Hi Ed, no need to apologize, you have been invaluable in my first
>>> steps
>>> >>> towards Drooling :-D so thanks for all your help, it is GREATLY
>>> >>> appreciated
>>> >>> :clap:.
>>> >>>
>>> >>> We have a few scenarios in mind but aren't really implementing them
>>> yet,
>>> >>> just trying to see if sliding windows works the way we think it does.
>>> In
>>> >>> the
>>> >>> simple rule I wrote above, I basically want to check if two facts are
>>> >>> temporally close.
>>> >>>
>>> >>> Yes, you are correct. I didn't pay enough attention to the manual and
>>> >>> didn't
>>> >>> use STREAM mode to enter in my facts. I will use the manual insertion
>>> >>> process found in "Example 2.10. Inserting facts into an entry point"
>>> of
>>> >>> section "2.3. Streams Support" to update my code. And, I will update
>>> my
>>> >>> rule
>>> >>> to specify a "from entry-point <Specific Stream>".
>>> >>>
>>> >>> Also, could you comment on the simple rule I am using? Does it look
>>> like
>>> >>> it
>>> >>> should work after I do the updates? Or is my logic incorrect?
>>> >>>
>>> >>> Thanks again.
>>> >>>
>>> >>>
>>> >>>
>>> >>>   Ober0n,
>>> >>>
>>> >>>   Sorry for the delay on answering. I am on a trip with limited
>>> internet
>>> >>> connection.
>>> >>>   I am interested in your experience with the sliding windows, since
>>> the
>>> >>> tests are working. Maybe it is a scenario not covered by the tests.
>>> >>>
>>> >>>   In any case, what is probably happening is that you are not
>>> >>> configuring
>>> >>> the engine to work in STREAM mode. The default mode is CLOUD and it
>>> does
>>> >>> not
>>> >>> support sliding windows. It seems the engine is silently failing in
>>> this
>>> >>> case, when the compiler raise an error to warn the user.
>>> >>>
>>> >>>    I just committed some docs on this subject:
>>> >>>
>>> >>>
>>> >>>
>>> https://hudson.jboss.org/hudson/job/drools/lastSuccessfulBuild/artifact/trunk/target/docs/drools-fusion/html/ch02.html#d0e1067
>>> >>>
>>> >>>    (plz, wait for hudson to rebuild the docs or build docs yourself).
>>> >>>
>>> >>>    Feedback welcome. I will complement the sliding window docs.
>>> >>>
>>> >>>    []s
>>> >>>    Edson
>>> >>>
>>> >>> 2009/3/29 ober0n <lili339 at hotmail.com>
>>> >>>
>>> >>> >
>>> >>> > Still trying to get sliding windows to work (basing my code off of
>>> the
>>> >>> > Eclipse supplied "Hello World" example). I don't think I fully
>>> >>> understand
>>> >>> > how it works yet so I'm trying to simplify things even further by
>>> >>> writing
>>> >>> > a
>>> >>> > simple rule that is meant to say:
>>> >>> >
>>> >>> > if (current_message = "Hello" AND exists( goodbye_message within
>>> >>> > sliding_window(3 seconds) ))
>>> >>> > then print("There was a GOODBYE message before the HELLO message."
>>> )
>>> >>> >
>>> >>> > In other words: This rule should fire if the current Hello World
>>> >>> message
>>> >>> > was
>>> >>> > preceeded within 3 seconds by a goodbye message.
>>> >>> >
>>> >>> >
>>> >>> >
>>> >>>
>>> ---------------------------------------------------------------------------------------------------
>>> >>> > I wrote a new rule for this:
>>> >>> >
>>> >>> > declare Message
>>> >>> >    @role( event )
>>> >>> > end
>>> >>> >
>>> >>> > rule "Goodbye before Hello World"
>>> >>> >        when
>>> >>> >                Message( status == Message.HELLO )
>>> >>> >                exists( Message( status == Message.GOODBYE ) over
>>> >>> > window:time( 3s ) )
>>> >>> >        then
>>> >>> >                System.out.println( "There was a GOODBYE message
>>> before
>>> >>> the
>>> >>> > HELLO
>>> >>> > message." );
>>> >>> > end
>>> >>> >
>>> >>> >
>>> >>> >
>>> >>>
>>> ---------------------------------------------------------------------------------------------------
>>> >>> >
>>> >>> > To send the messages: (ksession is a StatefulKnowledgeSession)
>>> >>> >
>>> >>> >                        ...
>>> >>> >                        ksession.insert(goodbye_message);
>>> >>> >                        ksession.fireAllRules();
>>> >>> >
>>> >>> >                        Thread.sleep(5000);
>>> >>> >
>>> >>> >                        ksession.insert(hello_message);
>>> >>> >                        ksession.fireAllRules();
>>> >>> >                        ...
>>> >>> >
>>> >>> >
>>> >>>
>>> ---------------------------------------------------------------------------------------------------
>>> >>> >
>>> >>> > I expect to get nothing back since I sent the Hello message 5
>>> seconds
>>> >>> > after
>>> >>> > the goodbye message (outside the sliding window of 3 seconds). But,
>>> >>> for
>>> >>> > some
>>> >>> > reason the rule fires and I get one:
>>> >>> >
>>> >>> > "There was a GOODBYE message before the HELLO message."
>>> >>> >
>>> >>> > Any help would be greatly appreciated.
>>> >>> >
>>> >>> > Thanks!
>>> >>> > --
>>> >>> > View this message in context:
>>> >>> >
>>> >>>
>>> http://www.nabble.com/Trying-to-get-Sliding-Windows-to-work-tp22735051p22770318.html
>>> >>> > Sent from the drools - user mailing list archive at Nabble.com.
>>> >>> >
>>> >>> > _______________________________________________
>>> >>> > rules-users mailing list
>>> >>> > rules-users at lists.jboss.org
>>> >>> > https://lists.jboss.org/mailman/listinfo/rules-users
>>> >>> >
>>> >>>
>>> >>>
>>> >>>
>>> >>> --
>>> >>>  Edson Tirelli
>>> >>>  JBoss Drools Core Development
>>> >>>  JBoss, a division of Red Hat @ www.jboss.com
>>> >>>
>>> >>> _______________________________________________
>>> >>> rules-users mailing list
>>> >>> rules-users at lists.jboss.org
>>> >>> https://lists.jboss.org/mailman/listinfo/rules-users
>>> >>>
>>> >>>
>>> >>>
>>> >>> --
>>> >>> View this message in context:
>>> >>>
>>> http://www.nabble.com/Trying-to-get-Sliding-Windows-to-work-tp22735051p22785711.html
>>> >>> Sent from the drools - user mailing list archive at Nabble.com.
>>> >>>
>>> >>> _______________________________________________
>>> >>> rules-users mailing list
>>> >>> rules-users at lists.jboss.org
>>> >>> https://lists.jboss.org/mailman/listinfo/rules-users
>>> >>>
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >>  Edson Tirelli
>>> >>  JBoss Drools Core Development
>>> >>  JBoss, a division of Red Hat @ www.jboss.com
>>> >>
>>> >> _______________________________________________
>>> >> rules-users mailing list
>>> >> rules-users at lists.jboss.org
>>> >> https://lists.jboss.org/mailman/listinfo/rules-users
>>> >>
>>> >>
>>> >
>>> >
>>>
>>> --
>>> View this message in context:
>>> http://www.nabble.com/Trying-to-get-Sliding-Windows-to-work-tp22735051p22844999.html
>>> Sent from the drools - user mailing list archive at Nabble.com.
>>>
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>
>>
>>
>> --
>>  Edson Tirelli
>>  JBoss Drools Core Development
>>  JBoss, a division of Red Hat @ www.jboss.com
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>


-- 
 Edson Tirelli
 JBoss Drools Core Development
 JBoss, a division of Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090402/249e345f/attachment.html 


More information about the rules-users mailing list