服务热线
135-6963-3175
规则引擎是由推理引擎发展而来,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。
目前业内有多个规则引擎可供使用,其中包括商业和开放源码选择。开源的代表是Drools,商业的代表是Visual Rules ,I Log。
Drools是个规则引擎的开源实现。
Drools(JBoss Rules )具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。
JBoss Rules的前身是Codehaus的一个开源项目叫Drools。现在被纳入JBoss 门下,更名为JBoss Rules,成为了JBoss应用服务器的规则引擎。
Drools是为Java量身定制的基于Charles Forgy的RETE算法的规则引擎的实现。具有了OO接口的RETE,使得商业规则有了更自然的表达。
Drools主要分为两个部分
1、Drools规则
2、Drools规则的解释执行。
规则的编译与运行要通过Drools 提供的相关API 来实现。而这些API 总体上游可分为三类:规则编译、规则收集和规则的执行。
Drools是业务规则管理系统(BRMS)解决方案,涉及以下项目:
Drools Workbench:业务规则管理系统
Drools Expert:业务规则引擎
Drools Fusion:事件处理
jBPM:工作流引擎
OptaPlanner:规划引擎
业务场景
风控反洗钱系统
商品折扣系统
积分系统
目前有两种商品钻石(diamond)和黄金(Gold),需要对这两种商品分别制定销售折扣(discount)。如果使用Drools规则引擎就是为了适用两种商品折扣的各种变化,不用修改代码就可以实现复杂业务组合的变更。当然简单的情况,使用普通的if else或配置项也可以达到变更的目的,那就不需要Drools,也就不是本节讨论的范畴了。
Drools5主要提供的API:
KnowledgeBuilder
KnowledgeBase
KnowledgePackage
StatefulKnowledgeSession
StatelessKnowledgeSession
KnowledgeBuilder | 在业务代码中收集已编写的规则,并对规则文件进行编译,生成编译好的KnowledgePackage集合,给其它的应用程序使用。通过其提供的hasErrors()方法获得编译过程中是否有错,getErrors()方法打印错误信息。支持.drl文件、.dslr文件和xls文件等。 |
KnowledgeBase | 收集应用当中知识(knowledge)定义的知识库对象(KnowledgePackage),在一个 KnowledgeBase 当中可以包含普通的规则(rule)、 规则流(rule flow)、函数定义(function)、用户自定义对象(type model)等,并创建session对象(StatefulKnowledgeSession和 |
KnowledgePackage | 存放编译之后规则的对象StatelessKnowledgeSession) |
StatefulKnowledgeSession | 接收外部插入的数据fact对象(POJO),将编译好的规则包和业务数据通过fireAllRules()方法触发所有的规则执行。使用完成需调用dispose()方法以释放相关内存资源。 |
StatelessKnowledgeSession | 对StatefulKnowledgeSession的封装实现,与其对比不需要调用dispose()方法释放内存,只能插入一次fact对象。 |
它们起到了对规则文件进行收集、编译、查错、插入fact、设置global、执行规则或规则流等作用。
Drools7版本已经不再使用此系列的API,就不再展开描述讲解5版本了。
KieServices | 通过它来获取的各种对象来完成规则构建、管理和执行等操作。 |
KieContainder | 可以理解KieContainer就是一个KieBase的容器。提供了获取KieBase的方法和创建KieSession的方法。 |
KieBase | 就是一个知识仓库,包含了若干的规则、流程、方法等,在Drools中主要就是规则和方法,KieBase本身并不包含运行时的数据之类的,如果需要执行规则KieBase中的规则的话,就需要根据KieBase创建KieSession。 |
KieSession | KieSession就是一个跟Drools引擎打交道的会话,其基于KieBase创建,它会包含运行时数据,包含“事实Fact”,并对运行时数据实时进行规则运算。通过KieContainer创建KieSession是一种较为方便的做法,其本质上是从KieBase中创建出来的。KieSession就是应用程序跟规则引擎进行交互的会话通道。 |
KieRepository | 是一个单例对象,它是存放KieModule的仓库,KieModule由kmodule.xml文件定义(当然不仅仅只是用它来定义)。 |
KieProject | KieContainer通过KieProject来初始化、构造KieModule,并将KieModule存放到KieRepository中,然后KieContainer可以通过KieProject来查找KieModule定义的信息,并根据这些信息构造KieBase和KieSession。 |
ClasspathKieProject | ClasspathKieProject实现了KieProject接口,它提供了根据类路径中的META-INF/kmodule.xml文件构造KieModule的能力,是基于Maven构造Drools组件的基本保障之一。意味着只要按照前面提到过的Maven工程结构组织我们的规则文件或流程文件,只用很少的代码完成模型的加载和构建。 |
1、Kmodule.xml的编辑
kmodule.xml文件放到src/main/resources/META-INF/文件夹