[rules-users] Agenda events in a Stateless session

Michal Bali michalbali at gmail.com
Sat Mar 7 16:45:37 EST 2009


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.

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> 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 listrules-users at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
>
>        _______________________________________________
> rules-users mailing listrules-users at lists.jboss.orghttps://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/20090307/edf2fe41/attachment.html 


More information about the rules-users mailing list