drools 规则引擎

来源:互联网 发布:html post json 编辑:程序博客网 时间:2024/05/18 04:59
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,也就是当前的规则只要满足条件,可以无限次执行


基本的文件样式如下:



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%


原创粉丝点击