天天看點

drools_04_global

關于 global 屬性

  • drl 檔案中可以設定任意多個 global 對象, 文法是​

    ​global dataType variable​

    ​ , dataType不能是int/double等原始類型.
  • 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();
    }
  }
}      

測試運作效果: