[rules-users] Agenda events in a Stateless session

Mark Proctor mproctor at codehaus.org
Sat Mar 7 21:09:21 EST 2009


Michal Bali wrote:
> Hi,
>
> I guess the issue is that StatelessKnowledgeSession doesn't extend the 
> WorkingMemory interface as David pointed out. So if you call 
> event.getKnowledgeRuntime() you'll get *null* back.
when in an event or in a consequence, whether using a stateless or 
stateful session it should return a knowledgeruntime instance - if it's 
not, it's a bug. I'll look into it.
>
> Similar issue happens when you call drools.getKnowledgeRuntime() from 
> within rule's consequence. However in this case it throws the 
> following exception (running with snapshot from 07. 03. 2009):
>
> org.drools.runtime.rule.ConsequenceException: 
> java.lang.ClassCastException: *org.drools.reteoo.**ReteooWorkingMemory 
> cannot be cast to org.drools.reteoo.**ReteooStatefulSession*
>     at 
> org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:23)
>     at 
> org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:943)
>     at 
> org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:885)
>     at 
> org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1082)
>     at 
> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:682)
>     at 
> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:659)
>     at 
> org.drools.impl.StatelessKnowledgeSessionImpl.execute(StatelessKnowledgeSessionImpl.java:213)
>     at com.sample.DroolsTest.main(DroolsTest.java:45)
> Caused by: java.lang.ClassCastException: 
> org.drools.reteoo.ReteooWorkingMemory cannot be cast to 
> org.drools.reteoo.ReteooStatefulSession
>     at 
> org.drools.base.DefaultKnowledgeHelper.getKnowledgeRuntime(DefaultKnowledgeHelper.java:222)
>     at 
> com.sample.Rule_Hello_World_0.consequence(Rule_Hello_World_0.java:7)
>     at 
> com.sample.Rule_Hello_World_0ConsequenceInvoker.evaluate(Rule_Hello_World_0ConsequenceInvoker.java:26)
>     at 
> org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:934)
>     ... 6 more
>
> for this rule:
> rule "Hello World"
>     when
>         Message( )
>     then
>         System.out.println( drools.getKnowledgeRuntime() );
> end
>
> Best Regards,
> Michal
>
>
> On Fri, Mar 6, 2009 at 6:45 AM, Mark Proctor <mproctor at codehaus.org 
> <mailto:mproctor at codehaus.org>> wrote:
>
>     David Boaz wrote:
>>     Your answer refered to Statefull session. My question was regarding a
>>     stateless session, that do not extend WorkingMemory.
>>       
>     you are using an event, that event exposes the knowledgeruntime in
>     the event listener - stateless and stateful use the same event
>     model and both expose the knowledgeruntime as a parameter. All
>     events should extend KnowledgeRuntimeEvent which provides the
>     method getKnowledgeRuntime.
>
>     Mark
>
>>     Currently, I did an ugly work-around. The Activation returns a
>>     Collection<FactHandle>, and I noticed that in runtime, the FactHandle is
>>     instanceof InternalFactHandle, that do have a getObject(). So, My code looks
>>     like:
>>     for(FactHandle handle:activation.getFactHandles()){
>>       assert(handle instanceof InternalFactHandle);
>>       Object o=((InternalFactHandle)handle).getObject();
>>       ...
>>     }
>>     Im looking for the correct way to implement this functionality. 
>>     Thanks, David
>>
>>
>>     Mark Proctor wrote:
>>       
>>>     David Boaz wrote:
>>>         
>>>>     Thanks Mark,
>>>>
>>>>     The post bellow doesn't deal with the event listener registration.
>>>>     Assuming
>>>>     the registration was solved, now I have another issue. How to retrieve
>>>>     the
>>>>     Facts given Fact-handles? In a stateless session, I have no access to the
>>>>     working memory.
>>>>       
>>>>           
>>>     If you are using StatefulKnowledgeSession. Then the Activation has
>>>         Collection< ? extends FactHandle> getFactHandles();
>>>
>>>     And the KnowledgeRuntime is always available, which extends the 
>>>     WorkingMemory.
>>>
>>>     Mkar
>>>         
>>>>     David
>>>>
>>>>
>>>>     Mark Proctor wrote:
>>>>       
>>>>           
>>>>>     David Boaz wrote:
>>>>>         
>>>>>             
>>>>>>     Hi all,
>>>>>>
>>>>>>     Im trying to listen to the events fired during the evaluation of a
>>>>>>     stateless
>>>>>>     session. I implemented org.drools.event.rule.AgendaEventListener. The
>>>>>>     events
>>>>>>     fire as expected. From the event I can extract the Activation, the Rule
>>>>>>     and
>>>>>>     the list of FactHandles. Now, from each FactHandle I want to retrieve
>>>>>>     the
>>>>>>     associated fact (Object). For that, I need a WorkingMemory. But the WM
>>>>>>     doesn't participate in the event signature. In addition, since Im using
>>>>>>     a
>>>>>>     stateless session, the working memory does not exist until I execute()
>>>>>>     method.
>>>>>>
>>>>>>     Can you please help?
>>>>>>       
>>>>>>           
>>>>>>               
>>>>>     The event listeners don't work in the last release, this is fixed in 
>>>>>     trunk, please give it a try in a snapshot:
>>>>>     https://hudson.jboss.org/hudson/job/drools/lastSuccessfulBuild/artifact/trunk/target/
>>>>>         
>>>>>             
>>>>>>     Thanks, David
>>>>>>       
>>>>>>           
>>>>>>               
>>>>>     _______________________________________________
>>>>>     rules-users mailing list
>>>>>     rules-users at lists.jboss.org <mailto:rules-users at lists.jboss.org>
>>>>>     https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>
>>>>>
>>>>>         
>>>>>             
>>>>       
>>>>           
>>>     _______________________________________________
>>>     rules-users mailing list
>>>     rules-users at lists.jboss.org <mailto:rules-users at lists.jboss.org>
>>>     https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>>
>>>         
>>       
>
>
>     _______________________________________________
>     rules-users mailing list
>     rules-users at lists.jboss.org <mailto: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
>   

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090308/e318622f/attachment.html 


More information about the rules-users mailing list