规则引擎Drools使用 第二篇Drools规则引擎介绍

 Drools规则引擎介绍

      drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中),使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效。

drools官网地址:https://drools.org/

drools源码下载地址:https://github.com/kiegroup/drools Drools规则主要组成

drools API开发步骤

了解认识下drools API开发的几个接口

KieServices 
该接口提供了很多方法,可以通过这些方法访问KIE关于构建和运行的相关对象,比如说可以获取KieContainer,利用KieContainer来访问KBase和KSession等信息;

可以获取KieRepository对象,利用KieRepository来管理KieModule等。 
KieServices就是一个中心,通过它来获取的各种对象来完成规则构建、管理和执行等操作。

KieContainer

KieContainer可以理解为是一个KieBase的容器。

KieBase 
KieBase可以理解为是一个知识仓库,包含了若干的规则、流程、方法等,在Drools中主要就是规则和方法,KieBase本身并不包含运行时的数据之类的,如果需要执行规则KieBase中的规则的话,就需要根据KieBase创建KieSession。


KieSession
KieSession就是一个跟Drools引擎打交道的会话,其基于KieBase创建,它会包含运行时数据,包含“事实 Fact”,并对运行时数据事实进行规则运算。我们通过KieContainer创建KieSession是一种较为方便的做法,其实他本质上是从KieBase中创建出来


KieRepository 
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组件的基本保障之一。
 

规则引擎构成

drools规则引擎由以下三部分构成:

Working Memory(工作内存)
Rule Base(规则库)
Inference Engine(推理引擎)
其中Inference Engine(推理引擎)又包括:

Pattern Matcher(匹配器)
Agenda(议程)
Execution Engine(执行引擎)

相关概念说明

Working Memory:工作内存,drools规则引擎会从Working Memory中获取数据并和规则文件中定义的规则进行模式匹配,所以我们开发的应用程序只需要将我们的数据插入到Working Memory中即可,例如本案例中我们调用kieSession.insert(order)就是将order对象插入到了工作内存中。

Fact:事实,是指在drools 规则应用当中,将一个普通的JavaBean插入到Working Memory后的对象就是Fact对象,例如本案例中的Order对象就属于Fact对象。Fact对象是我们的应用和规则引擎进行数据交互的桥梁或通道。

Rule Base:规则库,我们在规则文件中定义的规则都会被加载到规则库中。

Pattern Matcher:匹配器,将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,匹配成功的规则将被激活并放入Agenda中。

Agenda:议程,用于存放通过匹配器进行模式匹配后被激活的规则。

Execution Engine:执行引擎,执行Agenda中被激活的规则。

 规则引擎执行过程

KIE介绍

我们在操作Drools时经常使用的API以及它们之间的关系如下图:

通过上面的核心API可以发现,大部分类名都是以Kie开头。Kie全称为Knowledge Is Everything,即"知识就是一切"的缩写,是Jboss一系列项目的总称。如下图所示,Kie的主要模块有OptaPlanner、Drools、UberFire、jBPM。 

 通过上图可以看到,Drools是整个KIE项目中的一个组件,Drools中还包括一个Drools-WB的模块,它是一个可视化的规则编辑器。

深入了解下Kie系列

KieServices 是一个接口,我们通过KieServices.Factory.get()来获取
static class Factory {
    public Factory() { /* compiled code */ }

    public static org.kie.api.KieServices get() { /* compiled code */ }

    private static class LazyHolder {
        private static org.kie.api.KieServices INSTANCE;

        private LazyHolder() { /* compiled code */ }
    }
}

KieServices 几个重要方法:

public org.kie.api.builder.KieRepository getRepository() 
public org.kie.api.runtime.KieContainer getKieClasspathContainer() 
public org.kie.api.runtime.KieContainer getKieClasspathContainer(java.lang.ClassLoader classLoader) 
public org.kie.api.runtime.KieContainer getKieClasspathContainer(java.lang.String containerId, java.lang.ClassLoader classLoader)
public org.kie.api.runtime.KieContainer newKieClasspathContainer()
public org.kie.api.runtime.KieContainer newKieClasspathContainer(java.lang.String containerId)
public org.kie.api.builder.KieBuilder newKieBuilder(java.io.File file)
public org.kie.api.builder.KieBuilder newKieBuilder(org.kie.api.builder.KieFileSystem kieFileSystem) 
public org.kie.api.io.KieResources getResources() 
public org.kie.api.builder.KieFileSystem newKieFileSystem() 
public org.kie.api.builder.model.KieModuleModel newKieModuleModel()

 KieContainer

org.kie.api.KieBase getKieBase();

org.kie.api.KieBase getKieBase(java.lang.String s);
void dispose();
org.kie.api.runtime.KieSession newKieSession();
org.kie.api.KieBase newKieBase(java.lang.String s, org.kie.api.KieBaseConfiguration kieBaseConfiguration);
org.kie.api.runtime.KieSession newKieSession(java.lang.String s);
org.kie.api.runtime.StatelessKieSession newStatelessKieSession();
org.kie.api.runtime.StatelessKieSession newStatelessKieSession(java.lang.String s);
org.kie.api.runtime.KieSessionConfiguration getKieSessionConfiguration();

KieRepository
org.kie.api.builder.ReleaseId getDefaultReleaseId();
void addKieModule(org.kie.api.builder.KieModule kieModule);

KieBase
org.kie.api.definition.KiePackage getKiePackage(java.lang.String s);
void removeKiePackage(java.lang.String s);
org.kie.api.definition.rule.Rule getRule(java.lang.String s, java.lang.String s1);
void removeRule(java.lang.String s, java.lang.String s1);
org.kie.api.runtime.KieSession newKieSession();
org.kie.api.runtime.KieSession newKieSession(org.kie.api.runtime.KieSessionConfiguration kieSessionConfiguration, org.kie.api.runtime.Environment environment);
org.kie.api.runtime.StatelessKieSession newStatelessKieSession();

kieSession

void dispose();

 <T> T getKieRuntime(java.lang.Class<T> aClass);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员路同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值