drools 规则引擎

Drools基本语法:

传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后
得到的结果。
在drools中,这个传递数据进去的对象,术语叫Fact对象,Fact对象是一个普通的java bean
规则中可以对当前的对象进行任何的读写操作,调用该对象提供的方法
当一个java bean插入到workingMemory中,规则使用的是原有对象的引用,通过fact对象的读写
对其中的属性,需要提供getter setter访问器,规则中,可以动态的往当前workingMemory中插入删除新的Fact对象

规则文件可以使用.drl/.xml
使用规则:
package:对于一个规则文件而已,package是必须定义的,必须放在规则文件第一行
import:导入规则文件需要使用到的外部变量,导入的不仅仅可以是一个类,也可以是这个类
        中的某一个可访问的静态方法

rule:定义一个规则,一个规则同时包含三个部分
      1、属性部分,定义当前规则执行的一些属性等,比如是否可被重复执行、过期时间、生效时间等
      2、条件部分,即LHS定义当前规则的条件,如:when Message判断当前workingMemory中是否存在Message对象
      3、结果部分,即RHS可以写普通的java代码,即当前规则条件满足后执行的操作,可以直接访问fact对象的方法来操作
例如:
rule "name"
       no-loop true
       when
               $message:Message(status == 0)
       then
               System.out.println("fit");
               $message.setStatus(1);
               update($message);
end

no-loop:定义当前的规则是否不允许多次循环执行,默认是false,也就是当前的规则只要满足条件,可以无限次执行


基本的文件样式如下:

drools 规则引擎


pom.xml引入的:

<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
</dependency>

定义Fact实体Product:

public class Product {


    public static final String DIAMOND = "DIAMOND"; // 钻石


    public static final String GOLD = "GOLD"; // 黄金


    private String type;


    private int discount;
    //get,set省略

}


规则文件:

package com.rules


import cn.no7player.model.Product

rule Offer4Diamond

     when

      productObject : Product(type == Product.DIAMOND)

      then
         productObject.setDiscount(100);
       end


rule Offer4Gold
      when

      productObject : Product(type == Product.GOLD)

      then
        productObject.setDiscount(75);
       end

kmodule.xml

<?xml version="1.0" encoding="UTF-8" ?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">

    <kbase name="rules" packages="com.rules">
         <ksession name="ksession-rule"/>
    </kbase>
</kmodule>
Demo测试如下:

package cn.no7player.test;

import cn.no7player.model.Product;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class DroolsTest{

    @Test
   public void testRules(){

        KieServices ks = KieServices.Factory.get();
        KieContainer kieContainer =  ks.getKieClasspathContainer();
        //获取kmodule.xml中配置中名称为ksession-rulesession,默认为有状态的。
        KieSession kSession = kieContainer.newKieSession("ksession-rule");

        Product product = new Product();
        product.setType(Product.DIAMOND);

        kSession.insert(product);
        int count = kSession.fireAllRules();
        System.out.println("命中了"+count+"条规则");
        System.out.println("商品" +product.getType() + "的商品折扣为" + product.getDiscount() + "%");

    }
}

运行的结果如下:

命中了1条规则
商品DIAMOND的商品折扣为100%