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(a)codehaus.org
<mailto:mproctor@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/t...
>>>>
>>>>
>>>>> Thanks, David
>>>>>
>>>>>
>>>>>
>>>> _______________________________________________
>>>> rules-users mailing list
>>>> rules-users(a)lists.jboss.org
<mailto:rules-users@lists.jboss.org>
>>>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users(a)lists.jboss.org <mailto:rules-users@lists.jboss.org>
>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>>
>
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org <mailto:rules-users@lists.jboss.org>
https://lists.jboss.org/mailman/listinfo/rules-users
------------------------------------------------------------------------
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users