reference :http://blog.csdn.net/quzishen/article/details/6163012
http://blog.csdn.net/wo541075754/article/details/74456890
则引擎是由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。
Drools主要分为两个部分:一是Drools规则配置,二是Drools规则的解释执行。规则的编译与运行要通过Drools 提供的相关API 来实现。而这些API总体上可分为三类:规则编译、规则收集和规则的执行。
Drools是业务规则管理系统(BRMS)解决方案,涉及以下项目:
- Drools Workbench:业务规则管理系统
- Drools Expert:业务规则引擎
- Drools Fusion:事件处理
- jBPM:工作流引擎
- OptaPlanner:规划引擎
官网地址:http://www.drools.org/
官方最新文档:https://docs.jboss.org/drools/release/7.0.0.Final/drools-docs/html_single/index.html
配置简单说明:
kmodule中可以包含一个到多个kbase,分别对应drl的规则文件。
kbase需要一个唯一的name,可以取任意字符串。
packages为drl文件所在resource目录下的路径。注意区分drl文件中的package与此处的package不一定相同。多个包用逗号分隔。默认情况下会扫描resources目录下所有(包含子目录)规则文件。
kbase的default属性,标示当前KieBase是不是默认的,如果是默认的则不用名称就可以查找到该KieBase,但每个module最多只能有一个默认KieBase。
kbase下面可以有一个或多个ksession,ksession的name属性必须设置,且必须唯一。
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>
什么是KIE
KIE(Knowledge Is Everything),知识就是一切的简称。JBoss一系列项目的总称,在《Drools使用概述》章节已经介绍了KIE包含的大部分项目。它们之间有一定的关联,通用一些API。比如涉及到构建(building)、部署(deploying)和加载(loading)等方面都会以KIE作为前缀来表示这些是通用的API。下图为KIE所包含的子项目结构图:
无论是Drools还是JBPM,生命周期都包含以下部分:
- 编写:编写规则文件,比如:DRL,BPMN2、决策表、实体类等。
- 构建:构建一个可以发布部署的组件,对于KIE来说是JAR文件。
- 测试:部署之前对规则进行测试。
- 部署:利用Maven仓库将jar部署到应用程序。
- 使用:程序加载jar文件,通过KieContainer对其进行解析创建KieSession。
- 执行:通过KieSession对象的API与Drools引擎进行交互,执行规则。
- 交互:用户通过命令行或者UI与引擎进行交互。
- 管理:管理KieSession或者KieContainer对象。
FACT对象
Fact对象是指在使用Drools 规则时,将一个普通的JavaBean对象插入到规则引擎的 WorkingMemory当中的对象。规则可以对Fact对象进行任意的读写操作。Fact对象不是对原来的JavaBean对象进行Clone,而是使用传入的JavaBean对象的引用。规则在进行计算时需要的应用系统数据设置在Fact对象当中,这样规则就可以通过对Fact对象数据的读写实现对应用数据的读写操作。
当Fact对象插入到WorkingMemory当中后,会与当前WorkingMemory当中所有的规则进行匹配,同时返回一个FactHandler对象。FactHandler对象是插入到WorkingMemory当中Fact对象的引用句柄,通过FactHandler对象可以实现对Fact对象的删除及修改等操作。
通过调用insert方法将Product对象插入到WorkingMemory当中,Product对象插入到规则中之后就是说为的FACT对象。如果需要插入多个FACT对象,多次调用insert方法,并传入对应FACT对象即可。
Product product = new Product();
product.setType(Product.DIAMOND);
Product product2 = new Product();
product2.setType(Product.GOLD);
kSession.insert(product);
kSession.insert(product2);
int count = kSession.fireAllRules();
System.out.println("命中了" + count + "条规则!");
System.out.println("商品" +product.getType() + "的商品折扣为" + product.getDiscount() + "%。");
System.out.println("商品" +product2.getType() + "的商品折扣为" + product2.getDiscount() + "%。");
see :https://github.com/nick8sky/spring-clouds/tree/master/boot-drools