Thanks, that sounds logical to me. I guess I just have to "trust" that the rule where the array gets initialised activates earlier than the rule where I need the array. That shouldn't be a problem since I use salience and to avoid nullpoint exceptions I can use the if(objectList != null) in the "Then" part of the rule where I need the array.

Maybe an idea for the drools developers to create an "update" function for the globals so we can eval on them too...in the future.

vdelbart schreef:
It's normal.

Globally, the rule engine works in two steps :
 - first : the activation (the "when" statement)
 - second : the execution (the "then" statement) with salience, ruleflow ...

In your test, you have in the first step objectList = null and in the second
step objectList = [1, 2].

If you want to re-activate your rule, you have to do an update/insert/remove
action... But you can't do that with globals. So you need to use the WM
facts.



Waruzjan Shahbazian-2 wrote:
I have the same "problem", but eval(objectList == null) doesn't work. If I don't execute "drools.getWorkingMemory().setGlobal()" it "works fine", as if the rule activates and the object is null.

global List objectList;

rule "Start"
    salience 101
    when
        #conditions
    then
        objectList = new ArrayList() ;
        objectList.add("1");
objectList.add("2"); System.out.println("Start objectList:"+objectList); //drools.getWorkingMemory().setGlobal("objectList", objectList);
end

rule "end"
    salience 97
    when
        eval (objectList == null)
    then
        System.out.println("End objectList: "+objectList);
end
gives: Start objectList:[1, 2]
    End objectList: null

Next I uncomment the "drools.getWorkingMemory().setGlobal("objectList", objectList);" and run the rule again an get:

    Start objectList:[1, 2]
    End objectList: [1, 2]

so the objectList isn't null, but the rule still activates...

Kris Verlaenen schreef:
That initialized my global but the rule still runs every execution. Can I
disable the rule after the first execution?
What do you mean by "every execution". A rule should only be executed once, unless it gets reactivated (which should not be the case in this situation).

I would like to use (if (objectList==null)). My list is not immutable. Can
I make a similar rule for the LHS?
You can test whether the global is null using eval( objectList == null ) in the LHS of the rule.

Kris
_______________________________________________
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

Reply via email to