[rules-users] persistent java objects in working memory

Chris Richmond crichmond at referentia.com
Wed Sep 23 17:47:55 EDT 2009


Another correction.  It doesn't fire every time, it fires many times when
the value is not below 20.  It's strange, it fires correctly for a while,
but once it identifies a problem value, then it seems to fire on all values
for a few iterations.  It's erratic and incorrect to say the least. 

 

Perhaps my update is improperly done..

 

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:42 AM
To: 'Rules Users List'
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/b1442f3f/attachment.html 


More information about the rules-users mailing list