drrols规则引擎

author author     2022-08-08     319

关键词:

1.什么是规则引擎?

  规则引擎是一种嵌套在应用程序中的组件,它实现了将业务规则从应用程序代码中分离出来。规则引擎使用特定的语法编写业务规则,规则引擎可以接受数据输入、解释业务规则、并根据业务规则做出相应的决策。简单的说就是类似于于if...else语句

 

2.为什么要用规则引擎?

  -实现业务逻辑与业务规则的分离,实现业务规则的集中管理
  -可以动态修改业务规则,从而快速响应需求变更
  -使业务分析人员也可以参与编辑、维护系统的业务规则
  -使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得的简单
 
3.Drools规则的API
  ①KnowledgeBuilder
  KnowledgeBuilder 的作用就是用来在业务代码当中收集已经编写好的规则, 然后对这些规则文件进行编译, 最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用。KnowledgeBuilder 在编译规则的时候可以通过其提供的hasErrors()方法得到编译规则过程中发现规则是否有错误,如果有的话通过其提供的getErrors()方法将错误打印出来,以帮助我们找到规则当中的错误信息。创建KnowledgeBuilder 对象使用的是KnowledgeBuilderFactory 的newKnowledgeBuilder方法

  ②KnowledgeBase

  KnowledgeBase 是Drools 提供的用来收集应用当中知识(knowledge)定义的知识库对象,在一个KnowledgeBase 当中可以包含普通的规则(rule)、规则流(rule flow)、函数定义(function)、用户自定义对象(type model)等。KnowledgeBase 本身不包含任何业务数据对象(fact 对象),业务对象都是插入到由KnowledgeBase产生的两种类型的session 对象当中(StatefulKnowledgeSession 和StatelessKnowledgeSession,后面进行介绍),通过session 对象可以触发规则执行或开始一个规则流执行。创建一个KnowledgeBase 要通过KnowledgeBaseFactory 对象提供的newKnowledgeBase()方法来实现,这其中创建的时候还可以为其指定一个KnowledgeBaseConfiguration 对象,KnowledgeBaseConfiguration 对象是一个用来存放规则引擎运行时相关环境参数定义的配置对象

  ③StatefulKnowledgeSession

  StatefulKnowledgeSession 对象是一种最常用的与规则引擎进行交互的方式,它可以与规则引擎建立一个持续的交互通道,在推理计算的过程当中可能会多次触发同一数据集。在用户的代码当中,最后使用完StatefulKnowledgeSession 对象之后,一定要调用其dispose()方法以释放相关内存资源。StatefulKnowledgeSession 可以接受外部插入(insert)的业务数据——也叫fact,一个fact 对象通常是一个普通的Java 的POJO,一般它们会有若干个属性,每一个属性都会对应getter 和setter 方法,用来对外提供数据的设置与访问。一般来说,在Drools 规则引擎当中,fact 所承担的作用就是将规则当中要用到的业务数据从应用当中传入进来,对于规则当中产生的数据及状态的变化通常不用fact 传出。如果在规则当中需要有数据传出,那么可以通过在StatefulKnowledgeSession 当中设置global 对象来实现,一个global 对象也是一个普通的Java 对象,在向StatefulKnowledgeSession 当中设置global 对象时不用insert 方法而用setGlobal 方法实现。

  ④StatelessKnowledgeSession

  StatelessKnowledgeSession 的作用与StatefulKnowledgeSession 相仿,它们都是用来接收业务数据、执行规则的。事实上,StatelessKnowledgeSession 对StatefulKnowledgeSession 做了包装,使得在使用StatelessKnowledgeSession 对象时不需要再调用dispose()方法释放内存资源了。因为StatelessKnowledgeSession 本身所具有的一些特性,决定了它的使用有一定的局限性。在使用StatelessKnowledgeSession 时不能进行重复插入fact 的操作、也不能重复的调用fireAllRules()方法来执行所有的规则,对应这些要完成的工作在StatelessKnowledgeSession当中只有execute(…)方法,通过这个方法可以实现插入所有的fact 并且可以同时执行所有的规则或规则流,事实上也就是在执行execute(…)方法的时候就在StatelessKnowledgeSession内部执行了insert()方法、fireAllRules()方法和dispose()方法。

  ⑤Fact

  Fact是指在Drools规则应用当中,将一个普通的JavaBean插入到规则的WorkingMemory当中后的对象。规则可以对Fact 对象进行任意的读写操作,当一个JavaBean插入到WorkingMemory 当中变成Fact 之后,Fact 对象不是对原来的JavaBean对象进行Clon,而是原来JavaBean 对象的引用。规则在进行计算的时候需要用到应用系统当中的数据,这些数据设置在Fact 对象当中,然后将其插入到规则的WorkingMemory 当中,这样在规则当中就可以通过对Fact 对象数据的读写,从而实现对应用数据的读写操作。一Fact 对象通常是一个具有getter和setter方法的POJO 对象,通过这些getter和setter方法可以方便的实现对Fact 对象的读写操作,所以我们可以简单的把Fact 对象理解为规则与应用系统数据交互的桥梁或通道。

  ⑥规则文件

  在 Drools 当中,一个标准的规则文件就是一个以“.drl”结尾的文本文件,由于它是一个标准的文本文件,所以可以通过一些记事本工具对其进行打开、查看和编辑。规则是放在规则文件当中的,一个规则文件可以存放多个规则,除此之外,在规则文件当中还可以存放用户自定义的函数、数据对象及自定义查询等相关在规则当中可能会用到的一些对象。

    一个标准的规则文件的结构如下:

  package package-name

  imports

  globals

  functions

  queries

  rules

 

4.代码示例

global String test;
   
rule "Hello World"  
    when  
       //LHS块  
       //在working Memory中,如果存在一个Message对象满足他的status属性等于Message.HELLO条件,  
       //就把满足条件的Message实例用变量m表示,他的message属性用myMessage表示,以便在RHS中使用。  
       	TestInfo( info != null ) 
        m : Message( status == Message.HELLO, myMessage : message )  
    then  
       //RHS块  
       //在LHS中满足条件就运行RHS块。用到了LHS中的变量m,myMessage  
        System.out.println( myMessage );  
        System.out.println( test );  
        m.setMessage( "Goodbye cruel world" );  
        m.setStatus( Message.GOODBYE );  
        update( m );//表示把此Message实例在 working memory中更新.这便会触发名称为"GoodBye"的rule,   
end  
  
rule "GoodBye"  
    when  
        Message( status == Message.GOODBYE, myMessage : message )  
    then  
        System.out.println( myMessage );  
end  

  

  

public class StatefulKnowledgeSessionTest {
    public static void main(String[] args) {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
                .newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("drools/test.drl",
                StatefulKnowledgeSessionTest.class), ResourceType.DRL);
        Collection<KnowledgePackage> kpackage =
                kbuilder.getKnowledgePackages();
        KnowledgeBaseConfiguration kbConf = KnowledgeBaseFactory
                .newKnowledgeBaseConfiguration();
        kbConf.setProperty("org.drools.sequential", "true");
        KnowledgeBase kbase =
                KnowledgeBaseFactory.newKnowledgeBase(kbConf);
        kbase.addKnowledgePackages(kpackage);              StatefulKnowledgeSession statefulKSession=kbase.newStatefulKnowledgeSession();
        Message message = new Message();  
        message.setMessage("Hello World");  
        message.setStatus(Message.GOODBYE);
        statefulKSession.setGlobal("test","123");
        statefulKSession.insert(message);
        statefulKSession.fireAllRules();
        statefulKSession.dispose();
    }
}

旗正商业规则引擎和开源及其它规则引擎测试对比

 规则引擎在基础软件,或者在很多系统中已经不是稀奇的玩意,最近这几年,国内不断兴起很多的规则引擎,至于什么是规则引擎,在这篇文章中,就不做介绍了,我想能看以下内容的,多少对规则引擎也都有所了解了。国... 查看详情

规则引擎选型及简单应用

规则引擎实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。规则引擎具体执行可以分为接受数据输入,解释业务规则,根据业务规则做出业务决策几个过程,使用规则引擎可以把复杂、冗余... 查看详情

何时使用业务规则引擎

】何时使用业务规则引擎【英文标题】:WhenisaBusinessRulesEngineused【发布时间】:2010-10-2103:37:24【问题描述】:什么时候使用业务规则引擎?业务规则引擎和脚本/配置/定制有什么区别【问题讨论】:【参考方案1】:当您尝试在代... 查看详情

规则引擎用户界面设计

】规则引擎用户界面设计【英文标题】:RulesEnginesUserInterfaceDesign【发布时间】:2010-12-2604:02:09【问题描述】:在工作中,我们有优化引擎,这些引擎使用的输入之一是业务规则,我们使用专有的规则编辑器创建和编辑。这些规... 查看详情

drools规则引擎一文读懂(代码片段)

目录一、Drools简介电商平台的促销活动规则引擎Drools简介二、Drools快速入门 电商平台促销积分规则开发实现三、Drools规则引擎构成及其核心类Drools规则引擎构成Drools规则引擎概念四、Drools基础语法规则文件构成 规则体语法结... 查看详情

java规则引擎及jsr-94[转]

规则引擎简介     Java规则引擎是推理引擎的一种,它起源于基于规则的专家系统。     Java规则引擎将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。Java规则引... 查看详情

我应该使用啥规则引擎? [关闭]

】我应该使用啥规则引擎?[关闭]【英文标题】:WhatruleengineshouldIuse?[closed]我应该使用什么规则引擎?[关闭]【发布时间】:2010-09-0514:48:54【问题描述】:有哪些最好或最受欢迎的规则引擎?我还没有确定编程语言,所以告诉我... 查看详情

drools开源规则引擎比较难上手,有没有一款容易上手的规则引擎?

参考技术ADrools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。本文所使用的demo已上传htt... 查看详情

关于规则引擎的神话是啥? [关闭]

】关于规则引擎的神话是啥?[关闭]【英文标题】:Whatarethemythsaboutrulesengine?[closed]关于规则引擎的神话是什么?[关闭]【发布时间】:2011-05-0610:36:33【问题描述】:我正在写一篇关于规则引擎技术的演示文稿,特别是JBossDrools。... 查看详情

如何设计规则引擎?

】如何设计规则引擎?【英文标题】:Howtodesignaruleengine?【发布时间】:2010-09-1017:24:18【问题描述】:我应该在C#中创建一个简单的规则引擎。关于我如何继续进行的任何线索?它是一个简约的规则引擎,并将使用SQL服务器作为... 查看详情

实施规则引擎的指南

】实施规则引擎的指南【英文标题】:Guidelinesforimplementingaruleengine【发布时间】:2011-07-1321:02:14【问题描述】:实施您自己的规则引擎而不是使用现有的商业/开源引擎的原因可能是什么?实现规则引擎的任何具体指南?【问题... 查看详情

具有良好接口的开源规则引擎,用于编写规则

】具有良好接口的开源规则引擎,用于编写规则【英文标题】:Opensourcerulesenginewithdecentinterfaceforwritingrules【发布时间】:2010-09-0612:16:54【问题描述】:我正在尝试找到一个开源业务规则引擎,该引擎具有用于构建规则的良好界... 查看详情

规则引擎的应用

java开源的规则引擎有:Drools、EasyRules、Mandarax、IBMILOG。使用最为广泛并且开源的是Drools。     规则引擎的优点声明式编程规则可以很容易地解决困难的问题,并得到解决方案的验证。与代码不同,规则以较不复杂的语... 查看详情

什么时候不应该使用规则引擎? [关闭]

】什么时候不应该使用规则引擎?[关闭]【英文标题】:WhenshouldyouNOTuseaRulesEngine?[closed]【发布时间】:2010-10-2023:36:15【问题描述】:我有一个相当不错的使用规则引擎的优点列表,以及使用它们的一些原因,我需要的是你不应该... 查看详情

flink规则引擎实践分享(代码片段)

Flink规则引擎实践分享文章目录Flink规则引擎实践分享一、实时规则引擎架构***二、规则抽象模型三、规则、条件查询封装**3.1规则封装3.2查询规则封装四、基于ClickHouse实现用户行为明细查询服务支持4.1ClickHouse从Kafka摄取数据4.2Cl... 查看详情

规则引擎

参考技术A规则引擎drools的rete算法实现原理和事实匹配过程https://cloud.tencent.com/developer/article/1477434随笔分类-策略算法和规则引擎https://www.cnblogs.com/shangxiaofei/category/759910.htmlProductionMatchingForLargeLearningSystemshttp://reports-archive.adm.cs.cmu.... 查看详情

规则引擎可以完成啥?

】规则引擎可以完成啥?【英文标题】:WhatcanRulesEnginesaccomplish?规则引擎可以完成什么?【发布时间】:2010-12-0810:33:00【问题描述】:使用规则引擎可以实现哪些目标?【问题讨论】:我并不是要粗鲁,但是您尝试过Google吗?我... 查看详情

旗正规则引擎规则编辑

...sp;        看到有人问,旗正规则引擎定位就是规则逻辑实现简易,业务员也可以执行,可是试用的时候,突然发现还是有些凌乱,规则编辑感觉还是有点繁琐啊。那我说,方法还是没对路,接下来,... 查看详情