[rules-users] Synch Business Object / Working Memory

Jonathan Guéhenneux jojolemariole at hotmail.com
Fri Apr 11 08:23:16 EDT 2008


Indeed, it works but I will have to use such booleans for a lot of rules.

Cause my rule flow is schematically :

compute A
compute B(A)
compute C(B)
...

Perhaps I may create several ruleflows, one per independant computing?

Subject: RE: [rules-users] Synch Business Object / Working Memory
Date: Fri, 11 Apr 2008 12:11:32 +0100
From: manstis1 at ford.com
To: rules-users at lists.jboss.org










I was thinking something more like this:-
 

package 
com.sample
import 
com.sample.Test
 
rule "rule 1 - 1"
    salience 
90
    when
        a : 
Test(
         computed == 
"false",
            c 
< 15,
            d 
>= 75)        
    
then
     System.out.println("setting e to 
0");
        
a.setE(0);
        
update(a);
end
 
rule "rule 1 - 
2"
    salience 10
    
when
        a : 
Test(
            
computed == 
"false",
            c 
< 15,
            d 
>= 75)        
    
then
     System.out.println("setting e to 
1");
        
a.setE(1);
end

Note 
rule "rule 1 - 2" deliberately uses the same patterns as rule "rule 1 - 
1".
 
package com.sample;
 
public class Test {
    

    private boolean computed =false;
    
private int c=0;
    private int d=80;
    
private int e;
 
    public String 
getComputed(){
       
if(computed)
          return 
"true";
       
else
          return 
"false";
    }
 
    public int getC() 
{
        return c;
    
}
 
    public int getD() 
{
        return d;
    
}
 
    public void 
setE(int e){
        this.e = 
e;
        computed = 
true;
    }
 
}

Rule "rule 1 
- 1" is the only rule to run (and runs once); the second activatino being 
cancelled due to the update to "computed". Here's the audit 
view:-
 <object-stream>
  <list>
    
<org.drools.audit.event.ActivationLogEvent>
      
<activationId>rule 1 - 1 
[1]</activationId>
      <rule>rule 1 - 
1</rule>
      
<declarations>a=com.sample.Test at 67126712(1)</declarations>
      
<type>4</type>
    
</org.drools.audit.event.ActivationLogEvent>
    
<org.drools.audit.event.ActivationLogEvent>
      
<activationId>rule 1 - 2 
[1]</activationId>
      <rule>rule 1 - 
2</rule>
      
<declarations>a=com.sample.Test at 67126712(1)</declarations>
      
<type>4</type>
    
</org.drools.audit.event.ActivationLogEvent>
    
<org.drools.audit.event.ObjectLogEvent>
      
<factId>1</factId>
      
<objectToString>com.sample.Test at 67126712</objectToString>
      
<type>1</type>
    
</org.drools.audit.event.ObjectLogEvent>
    
<org.drools.audit.event.ActivationLogEvent>
      
<activationId>rule 1 - 1 
[1]</activationId>
      <rule>rule 1 - 
1</rule>
      
<declarations>a=com.sample.Test at 67126712(1)</declarations>
      
<type>6</type>
    
</org.drools.audit.event.ActivationLogEvent>
    
<org.drools.audit.event.ActivationLogEvent>
      
<activationId>rule 1 - 2 
[1]</activationId>
      <rule>rule 1 - 
2</rule>
      
<declarations>a=com.sample.Test at 67126712(1)</declarations>
      
<type>5</type>
    
</org.drools.audit.event.ActivationLogEvent>
    
<org.drools.audit.event.ObjectLogEvent>
      
<factId>1</factId>
      
<objectToString>com.sample.Test at 67126712</objectToString>
      
<type>2</type>
    
</org.drools.audit.event.ObjectLogEvent>
    
<org.drools.audit.event.ActivationLogEvent>
      
<activationId>rule 1 - 1 
[1]</activationId>
      <rule>rule 1 - 
1</rule>
      
<declarations>a=com.sample.Test at 67126712(1)</declarations>
      
<type>7</type>
    
</org.drools.audit.event.ActivationLogEvent>
  
</list>
</object-stream>
 



  
  
  From: rules-users-bounces at lists.jboss.org 
  [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Jonathan 
  Guéhenneux
Sent: 11 April 2008 11:33
To: Rules Users 
  List
Subject: RE: [rules-users] Synch Business Object / Working 
  Memory


  Ok, I think I understood well. I modified my business code, now I 
  call if

(wm != null)
        
      wm.update(wm.getFactHandle(this), this);

each time a 
  properties is modified.

But it is worse. Rules that sould be activated 
  only once actually loop, even if I add the no-loop clause.

I understand 
  why they loop, assuming update = (rectact + insert), but I dont get a solution 
  to my problem. I just want to notify an object changement in order to read 
  again the properties, but I dont want to restart the ruleflow.

Sorry, 
  but I find hard to say it in english because even in french, it's not very 
  clear ;)

  
    
    Subject: RE: [rules-users] Synch Business Object / Working Memory
Date: 
    Fri, 11 Apr 2008 10:39:41 +0100
From: manstis1 at ford.com
To: 
    rules-users at lists.jboss.org


    
    

    In essence, yes. Have a look at "update" in the manual (and a 
    read on Shadow Facts will probably be useful too).

    
      
      
      From: rules-users-bounces at lists.jboss.org 
      [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Jonathan 
      Guéhenneux
Sent: 11 April 2008 10:24
To: Rules Users 
      List
Subject: RE: [rules-users] Synch Business Object / Working 
      Memory


      yes, i made a mistake. its a.setE(...) and not 
      c.setE(...).

I don't call update. If I dont call update, properties 
      of an object are just read one time for all rules?



      
        
        Subject: RE: [rules-users] Synch Business Object / Working 
        Memory
Date: Fri, 11 Apr 2008 09:47:43 +0100
From: 
        manstis1 at ford.com
To: rules-users at lists.jboss.org


        

        I guess the example is a simplification as "c" 
        (in RHS) has not been bound to a fact.
         
        Anyway, that aside, do you call "update" to 
        ensure WM knows of changes to facts otherwise properties need to be 
        "time-constant" which in your example they are 
        not.

        
          
          
          From: rules-users-bounces at lists.jboss.org 
          [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of 
          Jonathan Guéhenneux
Sent: 11 April 2008 
          09:34
To: Rules Users List
Subject: [rules-users] 
          Synch Business Object / Working Memory


          Hi,

I have two rules :

rule "rule 1 - 
          1"
    
    salience 
          90
    ruleflow-group "rfg1"
    
          when
        a : 
          A(
            
          eComputed == "false",
        
              c < 15,
        
              d >= 75)        
          
    then
        
          c.setE(0);
end



rule "rule 1 - 
          2"

    salience 10
    
          ruleflow-group "rfg1"
    when
    
              a : A(
        
              eComputed == "false",
    
                  c >= 
          15,
            d 
          >= 75)        
    
          then
        
          c.setE(1);
end



and part of the corresponding 
          business code :

public class A {

    
          ...

    public String 
          getEComputed(){
       
          if(eComputed)
          return 
          "true";
       else
    
                return "false";
    
          }

    ...

    public void 
          setE(int e){
        this.e = 
          e;
        eComputed = 
          true;
    }

    
          ...

}



so, I expected that if the first rule is 
          activated, the second won't be. But according to my tests, the two 
          rule can be fired on the same object A.
While debugging, I noticed 
          the getEComputed method was only called once. I suppose that I should 
          write this :


rule "rule 1 - 1"
    
          
    salience 90
    
          ruleflow-group "rfg1"
    when
    
              a : A(
        
              eComputed == "false",
    
                  c < 15,
    
                  d >= 75)    
              
    then
    
              c.setE(0);
        
          c.setEComputed("true);
end



rule "rule 1 - 
          2"

    salience 10
    
          ruleflow-group "rfg1"
    when
    
              a : A(
        
              eComputed == "false",
    
                  c >= 
          15,
            d 
          >= 75)        
    
          then
        
          c.setE(1);
        
          c.setEComputed("true);
end

But I would prefer another 
          solution. Thanks for help.


          
          Plus de 15 millions de français utilisent Windows Live Messenger ! Téléchargez 
          Messenger, c'est gratuit ! 

      
      Plus de 15 millions de français utilisent Windows Live Messenger ! Téléchargez 
      Messenger, c'est gratuit ! 

  
  Tous vos amis discutent sur Messenger, et vous ? Téléchargez Messenger, 
  c'est gratuit ! 

_________________________________________________________________
Recevez tous vos e-mails sur un seul compte ! Créez une adresse Hotmail !
http://www.windowslive.fr/hotmail/default.asp
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20080411/6473b3bc/attachment.html 


More information about the rules-users mailing list