drools-基本使用

  • Post author:
  • Post category:其他




规则文件

名称 描述 备注
package 包,命名空间 包内的规则名称必须唯一
import 引入fact 可以是declare定义的类,也可以是java中定义的类
global 定义一个全局变量 使用kieSession.setGlobal(key,value)来设置其值
rule 规则明 同一个package下rule是唯一的
salience 规则优先级 可以是负数,0,正数;默认为0,数字越大优先级越高
when 规则中的条件部分 如果有多个规则都匹配,则所有规则都执行
then end 规则中执行的内容 可以直接使用java中定义的静态方法,最后一定接end
//包: 每一个规则开始包的名称。包充当规则命名空间。包内的规则名称必须是唯一的。在规则中包类似于Java包
package com.kittlen.cloud.drools.rules
//Import语句: 要应用规则的任何fact,这些fact都需要导入
import com.kittlen.cloud.drools.People
import org.slf4j.LoggerFactory
import org.slf4j.Logger

//定义一个全局变量,代码中使用kieSession.setGlobal(key,value)来设置其值;
global String a;

//rule, when, then, 以及 end. 在上述的例子中, rule 规则名 字符串
//when 部分是两个规则中的条件,then 部分是后果.在规则的术语,  when 部分也被称为LHS(左手侧)以及 then 部分作为规则的RHS(右手边)
//如果有多个规则都匹配,则所有规则都执行
//salience 的值越大,越优先执行
//rule "hello"
//    then
//     Logger log=LoggerFactory.getLogger("test");
//     log.info("hello,drools");
//     end

rule "helloMan"
    salience 11
    when
        $p: People(sex == "1") //使用 == 不要用equals 存在null情况
    then
        System.out.println("你好"+$p.getName()+"先生"+);
end

rule "helloWoman"
    salience 12
    when
        $p: People(sex == "2") //当kieSession.insert(obj);传入的对象时People并且perple的sex属性=="2"时执行该规则
    then
        System.out.println("你好"+$p.getName()+"女士");
end
名称 描述 备注
duration 规则将指定的时间之后在另外一个线程里触发 经测试在springboot中使用,第一次调用该规则时不执行,会在下一次调用kieSession.fireAllRules()的时候执行
date-expires 当系统时间<=date-expires后才会触发,即设置规则过期时间 默认时间格式为dd-MMM-yyyy,可以通过设置系统时间格式System.setProperty(“drools.dateformat”, “yyyy-MM-dd”)来进行修改格式
date-effective 当系统时间>=date-effective后才会触发,即设置规则生效时间 默认时间格式为dd-MMM-yyyy,可以通过设置系统时间格式System.setProperty(“drools.dateformat”, “yyyy-MM-dd”)来进行修改格式
package com.kittlen.cloud.drools.rules

import com.kittlen.cloud.drools.Tax

rule "-1"
    salience 0
    when $t:Tax()
    then
     System.out.println($t.getIncome());
     end

rule "0"
    //duration 设置该属性,规则将指定的时间之后在另外一个线程里触发
    //经测试在springboot中使用,第一次调用该规则时不执行,会在下一次调用kieSession.fireAllRules()的时候执行
//    duration 100
    salience 1 //salience 的值越大,越优先执行
//    no-loop 设置一次fireAllRules当前规则只执行一次
    when $t:Tax(income <= 3500)
    then
        System.out.println("0");
        $t.setNeedPayTax(100);
     end

rule "1"
//当系统时间<=date-expires后才会触发,即设置规则过期时间
//    date-expires "2021-08-31" //Wrong date-expires value: Invalid date input format: [2021-08-31] it should follow: [dd-MMM-yyyy] : [Rule name='1']
    date-expires "2021-08-31" //设置系统时间格式System.setProperty("drools.dateformat", "yyyy-MM-dd");可以这样使用
    //当系统时间>=date-effective后才会触发,即设置规则生效时间
    date-effective "2021-08-01"
    salience 2
//    no-loop
    when $t:Tax(income <= 3500)
    then
         System.out.println("1");
         $t.setNeedPayTax(100);
    end

rule "2"
    salience 2
    no-loop
    when $t:Tax(income <= 5000 && income > 3500)
    then
         System.out.println("2");
         $t.setNeedPayTax(($t.getIncome()-3500)*0.3);
    end
名称 描述 备注
activation-group 分组 同一个分组中,如果多个匹配,则仅匹配一个,默认执行按顺序排列的第一个,如果配置了salience(优先级),则执行salience最大的那个
package com.kittlen.cloud.drools.rules

import com.kittlen.cloud.drools.Group

rule "byGroup"
    activation-group "group1" //分组 同一个分组中,如果多个匹配,则仅匹配一个,默认按顺序排列的第一个,如果配置了salience,则按照salience的第一个
    when
        $g:Group()
    then
     System.out.println("by1"+$g.getName());
     end

rule "byGroup2"
    salience 1
    activation-group "group1"
    when
        $g:Group()
    then
     System.out.println("by2"+$g.getName());
     end



使用

package com.kittlen.cloud.controller;

import com.kittlen.cloud.drools.AllTax;
import com.kittlen.cloud.drools.Tax;
import entities.Result;
import org.kie.api.runtime.KieSession;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author kittlen
 * @version 1.0
 * @date 2021/8/31 0031
 */
@RestController
@RequestMapping("/tax")
public class SelfTaxController {

    @Resource
    KieSession kieSession;

    @RequestMapping("/calculate")
    public Result calculate(double income) {
        Tax tax = new Tax();
        tax.setIncome(income);
        kieSession.insert(tax);
        kieSession.fireAllRules();
        return Result.ok(tax);
    }
}



补充



declare


参考此文章



KieSession和KieBase


参考文章的(配置kie)



版权声明:本文为weixin_44728369原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。