drools_04_global
關于 global 屬性
- drl 文件中可以設置任意多個 global 對象, 語法是
global dataType variable, dataType 不能 是int/double等原始類型. - global 作用: 用于Java和規則之間傳遞數據, 或者規則之間傳遞數據, 比如我們在 java 端將 outOfStockProducts 傳遞到規則.
- 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();
}
}
}
測試運行效果:


浙公網安備 33010602011771號