關于 global 屬性
- drl 檔案中可以設定任意多個 global 對象, 文法是
, dataType不能是int/double等原始類型.global dataType variable
- global 作用: 用于Java和規則之間傳遞資料, 或者規則之間傳遞資料, 比如我們在 java 端将 outOfStockerProducts 傳遞到規則.
- global 對象可以通過 KieSession API 設定, 也可以在規則中設定, 就像是規則的普通變量一樣.
- global 對象最好是通過KieSession API 設定設定, 這樣能確定在pattern match之前就已ready.
- 在規則中修改 global 對象, 将影響後續規則和Java 對象, 下面是測試結果:
- 集合類型: 新值對Java代碼和所有規則都生效.
- POJO: 新值對Java代碼和所有規則都生效.
- Integer/Double等包裝類型: : 新值對Java代碼和所有規則都生效.
- int/double 類型: 不能用于 global 對象的定義.
包裝類型的global對象影響範圍測試代碼
Drools drl 檔案:
package com.sample.rules
import com.sample.Order;
global Double $totalCount ;
rule "rule1"
salience 2
when
$order:Order()
then
System.out.println("==============");
System.out.println("rule1 fired");
System.out.println("old $totalCount:" +$totalCount);
$totalCount=10D ;
System.out.println("$totalCount:" +$totalCount);
end
rule "rule2"
salience 0
when
$order:Order()
then
System.out.println("==============");
System.out.println("rule2 fired");
System.out.println("$totalCount:" +$totalCount);
end
測試Java類 代碼:
package com.sample;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
/**
* This is a sample class to launch a rule.
*/
public class DroolsTest {
public static final void main(String[] args) {
try {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
Double globalValue = Double.valueOf(2.1);
kSession.setGlobal("$totalCount", globalValue);
System.out.println("old java code $totalCount:" + globalValue);
Order order = new Order();
kSession.insert(order);
kSession.fireAllRules();
globalValue = (Double) kSession.getGlobal("$totalCount");
System.out.println("==============");
System.out.println("java code $totalCount:" + globalValue);
kSession.dispose();
// System.out.println(order.getRealPrice());
} catch (Throwable t) {
t.printStackTrace();
}
}
}
測試運作效果: