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();
		}
	}
}

测试运行效果:
测试运行效果

参考

posted @ 2022-10-20 07:09  harrychinese  阅读(13)  评论(0编辑  收藏  举报