Mark Proctor wrote:
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.
I've looked into this and fixed the bug, you should now be able to access the knowledgeruntime from the consequence and the event. Please do retest all of this from trunk
https://hudson.jboss.org/hudson/job/drools/lastSuccessfulBuild/artifact/trunk/target/

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

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

Reply via email to