It works now (I get a StatefulKnowledgeSessionImpl back which is fine). Thanks for fixing this.
Mark Proctor wrote: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 trunkMichal Bali wrote:Hi,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 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@codehaus.org> wrote:
David Boaz wrote: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.Your answer refered to Statefull session. My question was regarding a stateless session, that do not extend WorkingMemory.
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. MkarDavid 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@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users_______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users