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 <[email protected] <mailto:[email protected]>> 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
    [email protected] <mailto:[email protected]>
    https://lists.jboss.org/mailman/listinfo/rules-users


    _______________________________________________
    rules-users mailing list
    [email protected] <mailto:[email protected]>
    https://lists.jboss.org/mailman/listinfo/rules-users




    _______________________________________________
    rules-users mailing list
    [email protected] <mailto:[email protected]>
    https://lists.jboss.org/mailman/listinfo/rules-users


------------------------------------------------------------------------

_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to