Global variable in Drools rule

rishi picture rishi · Dec 1, 2016 · Viewed 15.2k times · Source

Is there any way I can get back the Integer value updated in Drools rule. I am passing the string in my rule. I can see my rule running but I am not getting the updated global variable's value. Here is my Drools rule file :

import com.MessageType;

global java.lang.Integer delayInSeconds;

rule "Delay for Update"
when 
String(this == MessageType.UPDATE.getType())
then
System.out.println("Running delay rule.....");
delayInSeconds = 10;
update(delayInSeconds); // This gives me runtime error. If I remove it I dont get error but dont get updated value.
end

I have also tried this : kcontext.getKieRuntime().setGlobal("delayInSeconds" , 10); but no luck :(

I know I can pass this variable by setting in POJO. So just wanted to confirm if there is any way by we can get updated value using global Integer. Please suggest.

Answer

laune picture laune · Dec 1, 2016

Global variables are a different species. You can read them, you can use them almost (!) like plain old variables, but:

Any update of a global variable must be done via the API method KieRuntime.setGlobal().

In your rule, you could use

drools.setGlobal( delayInSeconds, Integer.valueOf(10) );

You cannot use update with a global - it is not a fact. Also, rules will not react to a change of a global. Use a fact if you need this.