技术交流28群

服务热线

135-6963-3175

微信服务号

规则引擎 更新时间 2022-2-21 浏览2882次

规则引擎是由推理引擎发展而来,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。

目前业内有多个规则引擎可供使用,其中包括商业和开放源码选择。开源的代表是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
KieSessionKieSession就是一个跟Drools引擎打交道的会话,其基于KieBase创建,它会包含运行时数据,包含“事实Fact”,并对运行时数据实时进行规则运算。通过KieContainer创建KieSession是一种较为方便的做法,其本质上是从KieBase中创建出来的。KieSession就是应用程序跟规则引擎进行交互的会话通道。
KieRepository

是一个单例对象,它是存放KieModule的仓库,KieModule由kmodule.xml文件定义(当然不仅仅只是用它来定义)。

KieProjectKieContainer通过KieProject来初始化、构造KieModule,并将KieModule存放到KieRepository中,然后KieContainer可以通过KieProject来查找KieModule定义的信息,并根据这些信息构造KieBase和KieSession。
ClasspathKieProjectClasspathKieProject实现了KieProject接口,它提供了根据类路径中的META-INF/kmodule.xml文件构造KieModule的能力,是基于Maven构造Drools组件的基本保障之一。意味着只要按照前面提到过的Maven工程结构组织我们的规则文件或流程文件,只用很少的代码完成模型的加载和构建。

1、Kmodule.xml的编辑

kmodule.xml文件放到src/main/resources/META-INF/文件夹