[rules-users] persistent java objects in working memory

Greg Barton greg_barton at yahoo.com
Wed Sep 23 18:05:41 EDT 2009


What is the $sb in the action of the rule "Identify  MyObject"?

Again, the "testFieldData < 20" condition will not apply properly unless you update the MyDataObject object at some point after testFieldDatahas been set.

Also, it wouldn't be a good idea to call "update($mo);" in the action of "Identify 
MyObject," if that's what you were attempting.  Without the lock-on-active directive that would result in an infinite loop.




________________________________
From: Chris Richmond <crichmond at referentia.com>
To: Rules Users List <rules-users at lists.jboss.org>
Sent: Wednesday, September 23, 2009 4:41:47 PM
Subject: Re: [rules-users] persistent java objects in working memory

 
Correction to this…this does not
work either..it was coincidental that I was seeing output on the 2nd rule, but it fires no matter the value of testFieldData and does not fire at
all ever without the $c : Cycle() ; statement.  I am talking about the
second rule.  The first rule fires, but my combination of upate and 2nd rule is not working and not sure why.
 
Thanks,
Chris
 

________________________________
 
From:rules-users-bounces at lists.jboss.org
[mailto:rules-users-bounces at lists.jboss.org] On
Behalf Of Chris Richmond
Sent: Wednesday, September 23,
2009 11:34 AM
To: ' Rules Users List '
Subject: Re: [rules-users]
persistent java objects in working memory
 
Yes..I have these rules and the problem
was I wasn’t including the  $c: cycle in the second rule ( I bolded
it).  
 
So any rule I write subsequently has to
have that $c : cycle()  check in order to fire now? Not just the first
rule which identifies all in memory objects and calls update on them?
 That seems counterintuitive..it seems like if I simply call update() on
each object in the first rule, that the second should fire withought checking
the Cycle object as well.
 
Chris
 
rule "Identify 
MyObject"
   lock-on-active
when
   $mo : MyDataObject();
   $c : Cycle();
then
  
System.err.println("MYDATAOBJECT in system: " + $mo.getID() + "
| " + $mo.getTestFieldData();
   update($sb);
end
 
rule "Identify
Problem"
   lock-on-active
when
   $mo :
MyDataObject($td:testFieldData < 20);
   $c : Cycle();
then
  
System.err.println("OUT OF SPEC MYDATAOBJECT: " + $mo.getID() +
" | " + $mo.getTestFieldData() + " | " + $td);
 
end
 

________________________________
 
From:rules-users-bounces at lists.jboss.org
[mailto:rules-users-bounces at lists.jboss.org] On
Behalf Of Greg Barton
Sent: Wednesday, September 23,
2009 11:01 AM
To: Rules Users List
Subject: Re: [rules-users] persistent
java objects in working memory
 
Did you inform the engine that testFieldData had changed?  You
need to either call update(MyDataObject) from the
action of a rule, or if you're outside the engine, update() or asyncUpdate() on
the session.  Otherwise, as far as the engine is concerned, the value
hasn't changed.
 

________________________________
 
From:Chris
Richmond <crichmond at referentia.com>
To: Rules Users List <rules-users at lists.jboss.org>
Sent: Wednesday, September 23,
2009 3:35:46 PM
Subject: Re: [rules-users] persistent
java objects in working memory
Now I am really confused, when I try to set some condition
on the MyDataObject itself like this
 
rule "Identify Java Objects"
   lock-on-active
when
   $mo : MyDataObject($mf:testFieldData <
20);
   $c : Cycle();
then
   System.err.println("MYOBJECT in
system: " + $mo.getID() + " | " + $mo.getTestFieldData());
end 
 
 
Then this still fires every single time, even when
testFieldData is over 20….
 
-Chris
 
 
 

________________________________
 
From:rules-users-bounces at lists.jboss.org [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Greg Barton
Sent: Wednesday, September 23,
2009 10:02 AM
To: Rules Users List
Subject: Re: [rules-users]
persistent java objects in working memory
 
You've answered your own
question. :)  The rule you've given will only fire when the object is
asserted or modified. (And you have to inform the engine of the
modification.)  You have to inform the engine that the object has been
modified every cycle. (And if you want the engine to fire that rule even if the
object has not been modified, you can still inform the engine.  All that
does is force the rules to reconsider the object.)

However, the way I'd do it is to have a new object that is inserted on each
iteration.  Let's call it "Cycle" and give it a count. Then your
rule would look like this:
rule "Identify Java Objects"
   lock-on-active
when
   $mo : MyDataObject();
   $c : Cycle();
then
   System.err.println("MYOBJECT in
system: " + $mo.getID() + " | " + $mo.getTestFieldData() +
" on Cycle " + $c.getCount());
end 

When the iteration is over, you would retract the Cycle object.  (Only one
Cycle should be in working memory at once, and it's a good idea to have a rule
that enforces that invariant.)  You should follow this pattern for any
rule you want to guarantee to fire on each iteration.

________________________________
 
From:Chris
Richmond <crichmond at referentia.com>
To: Rules Users List <rules-users at lists.jboss.org>
Sent: Wednesday, September 23,
2009 2:15:35 PM
Subject: [rules-users] persistent
java objects in working memory
Hello,
 
I am trying to create a set of java
objects, which I insert into the session at startup.  Then at regular
timed iterations I want to examine the values of those objects.  During
the timer iteration, some fields may have been changed by the primary program.
 So I have a rule for now that is just trying to identify that the do
indeed exist on each iteration:
 
rule "Identify Java Objects"
   lock-on-active
when
   $mo : MyDataObject();
then
   System.err.println("MYOBJECT in
system: " + $mo.getID + " | " + $mo.getTestFieldData);
 
end   
 
 
As I said, at startup I insert 3 of these objects into my
session, then every 10 seconds I just want to ensure they are there.
 However the output from this rule only fires on the firet iteration,
after that the rule doesn’t fire.  I am not retrcating the objects
or even concerning myself with the FactHandle, as I plan to leave them in
working memory and change values on those 3 objects from the main application
in each application loop, then make decisions in the rule engine based on the
values of those 3 objects.   However, for now I just nee to find out
why the objects only live for my first loop and call of session.fireAllRules().
 
Any ideas or what I am doing wrong?
 
Thanks,

Chris


      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090923/fad14715/attachment.html 


More information about the rules-users mailing list