drools规则引擎的基本用法

第一步,项目中引入maven依赖
<dependencies>
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-core</artifactId>
        <version>7.6.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-compiler</artifactId>
        <version>7.6.0.Final</version>
    </dependency>
</dependencies>

第二步,新建规则文件

新建一个文件后缀为drl格式文件,如:test.drl 

其中文件各个模块说明如下:

 文件各部分说明

<1>、package  主要是定义一个包名

<2>、import  主要是引入需要用到的类 

<3>、dialect  ‘java’  默认固定值

<4> 、rule体说明

      rule 是打头,‘man’  是一个规则的名字,后面Java代码里面可以根据名字来执行某一个规则

      when 规则里面的条件判断,相当于Java里面的if()条件判断。

       上面两行写法也可以写成一行: $map:Map(this["status"]=="0");

       Map()  指的是Java传过来的数据对象是一个map对象,()表示里面要过滤条件。$map这个变量来接收传过来的值。

      then 就是根据条件判断之后要什么样的结果,里面可以往对象里面设值、也可以执行业务方法。

      如:匹配上这个规则之后,给这个map对象重新put一个值,如上。在Java执行完这个规则文件之后就可以取到这个值。

<5>、drl文件的注释,跟Java代码的注释写法一样,用//或者/***/单行或者多行注释。

第三步,Java后端说明

KieServices:接口,可以访问所有的创建和运行时对象。

KieContainer: 装载与引擎相关的组件,通过KieServices.Factory.get()方式获得,为其他Kie工具提供服务。KieContainer可以通过ReleaseIdArtifactVersion参数获得另外一个KieContainer。

KieSession:在Drools中,KIE会话存储并执行运行时数据。

Drools有工具类,可以KieHelper类,可以用来创建容器。
  • 创建KieHelper对象
KieHelper helper = new KieHelper();
  • 读取规则文件、把规则加进去 String rule = new String(Files.readAllBytes(Paths.get(path)),Charset.defaultCharset()); // 读取规则文件并转成字符串加载到content中去 helper.addContent(rule, ResourceType.DRL);
  • 获取规则引擎容器
  • KieContainer kieContainer = helper.getKieContainer();
   KieSession kSession = kieContainer.newKieSession();

    获取规则引擎容器,然后创建会话,后续数据操作都是用会话来操作的。

  • 规则引擎传入数据参数

kSession.insert(dataMap);

// 数据添加进去

         kSession.fireAllRules();

// 执行所有规则

      kSession.dispose();

// 输出

dataMap就是你要传入到规则引擎里面的数据。

注意:如果要传入多个对象,就写多个kSession.insert()。

但是如果是多个相同的对象,比如说:两个map对象,map1,map2

传过去,drl规则文件接收时候就区分不出来接收是哪个,所以这里建议用global传值。

第四,global用法

第一种:在KieSession设置全局变量

第一步:

kSession.setGlobal("map1", dataMap);

kSession.setGlobal("map2", dataMap);

第二步:在drl规则文件里取值

在下面直接用map1就可以取值,赋值了

第二种:在KieSession设置类或者service

第一步:

   kSession.setGlobal("testDrlService", testDrlService);

如果方法是静态方法,后面的值就直接放类点class或者new一个对象;

如果方法非静态,可以用@autowide把service注解进来,放进去。

第二步:

在drl文件中调用服务实例

可以调用更新方法直接更新数据库数据。

第五、 函数用法

在drl文件中也可以像js中写函数一样,直接写函数,位置放在import下面即可。

 

在rule里面需要调用的话,直接用,如:

drlPrint(“测试函数1111111”);

​​​​​​​第六、 其他扩展说明

                                                 

 

  1. 对规则指定分组,可以只执行某一个组下面的规则,下面只执行base组下面的规则

kSession.getAgenda().getAgendaGroup("base").setFocus();

  1. 对规则名过滤,只执行某个规则名下面的规则

kSession.fireAllRules(new RuleNameEqualsAgendaFilter("man"))

list数据取值

 

List数据可以用 对象 from 列表,这样就是循环执行,如上:

上面规则说明:可以根据条件来判断只执行输出那条结果,比如说工资大于10000,执行a输出结果,小于执行b输出结果,但是最后都需要执行then里面的。

也可以

 

循环取list

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值