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

nestabur nestabur at gmail.com
Thu Apr 2 06:32:06 EDT 2009



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.




More information about the rules-users mailing list