了解JBoss Drools Engine
说一个自己比较喜欢的开源产品JBoss Drools, 很多企业内部大型项目都在使用的规则引擎
该怎么理解规则引擎,到底是个什么东西,我好像没听过,我们能用么。
它是配有内置算法及对应数据结构的计算容器,在容器内部可以写我们的业务规则或计算规则。这套算法在规则引擎内的规则数爆增的情况下,可保计算速率不会有明显影响。 光是这点,就足够有吸引力。自己纯写代码不能避免这个问题。举个例子,比如有一个场景根据受保人的信息及车况信息来计算他下一年要交多少车险。略想一下,这个问题很简单么,就是建一个Java Pojo Bean Customer类,然后去针对这个Customer类的各个属性值在哪个区间内给出对应的车险金额。那我们可以这样写:
if((customer.getAge>24||customer.age<40)and (customer.getLoyaltyLevel()==Rang.GOLD) and (customer.getCarAge()<5) and customer.getCarCrashed()==0)
{
payment = 2000;
}
else if(...)
else if(...)
else if(...)
...
else
{
}
好,当我们写了十几、二十个的else if,这条业务才写完,然后也没错,我们意大利式面条的代码就出现了,看着有木有好揪心,有密集恐惧症的童鞋就碰也不想碰这套业务了。
那这种写法的大O记号为O(n),但如果这些业务规则写在规则引擎内,它的大O记号一定是O(1)<x<O(n),而且很有可能无限趋近于O(1),这是因为Drools engine的ReteOO+Phreak算法,可以做Node Index, Node Sharing, 对某些运算符优化,消除无用的部分匹配等等。这就是为什么规则数爆增的情况下,计算速率不会有明显影响。有兴趣可以去看看这两个算法。
那更多的业务情况不会有这么简单,更多的是几套子业务规则拼成一个完整的业务,一般情况是,先从前面的子业务规则做收纳,把可能有效的信息放在一个集合内。那在后面的业务规则再去把这个集合内的对象遍历一遍做减法,该修改的修改,该移除移除的。然后得出一个最优解。那代码就变成if()else if()...else() + for(if()else if()...else())...,好吧,这又是一份意大利面。说好编程是门艺术呢?怎么编程变成意大利面烹饪技???
Drools的规则语法是声明式的,不是解释式的。只要把每个业务规则写进去,把要计算的对象放进Working Memory中,规则引擎自己帮咱们算,我们不需要写if else,不需要写for或while。因为Drools的Working memory中的每个对象会被自动的去匹配所有的规则,它内部的事情就交给Drools的算法吧。我们只要告诉它有什么样的业务规则就好。Just care what to do, don't worry how to do.
有一次在我把基于Drool写出来的项目给一客户看,他面露喜色,这东西很巧嘛。 嘿嘿,灵巧之处还不仅仅在于此。
它能线上修改业务规则,不需要启停服务。在Drools中,业务规则没有放在Java代码内,是以单独的文件形式存放,比如drl(其实是txt)、csv、excel。业务与代码,业务与数据分离了。只要咱们的Model没变,只变业务规则,我们就不用修改代码,比方说,正好感上公司十周年庆,全场5折,仅限本周。这个需求一下来,我们就得开始去屡我们的意大利面,然后找到修改的地方,改完以后发QA测,产品人员验收,打包上线。 然而在Drools中,负责产品的人员就可以直接做了,不需要开发人员及QA的介入。有时候产品和开发、QA得解释半天要上线的规则,开发和QA才能听明白。这一套流程下来,一两天去了。如果产品自己做,几分钟或半小时就能搞定。 在互联网+的今天,时间就是市场。
有些人可能觉得这是不是有点夸张,其实真的可以,我们只需要为产品做一个规则管理的Web系统,这套管理系统能检索到所有的规则,并能增删改查及仿真。只有产品不要求开发改数据模型,就真心没开发QA什么事了。有人说,如果我把规则直接放数据库就好了,为什么还要用Drools?很好,但是您要加的规则不是模板化的怎么办?如果是多个对象协同计算怎么办?您是不是要去修改表结构?您也别忽略了Drools 算法的可优化性及潜力。
说了Drools这么多好处,它的缺点也不能不谈,它既然内置了一套算法和数据结构,说明它就是有开销的。它能把Java代码以外的规则文件并入到JVM内一起协作,也是有开销的。但是这些开销是只是业务规则小,计算量小的时候才能体现出来是个问题,如果业务规则复杂和计算量大可以靠它的算法去优化,它的价值就体现出来了。而且这些开销仅仅是在规则加载的时候比较明显。 要不说架构是演变出来的,从来就没有一颗银弹。但是在内存这么便宜的今天,Drools这么点开销真算不上什么 。
所以不是所有的应用都适合用它,如果只有一个或几个简单的规则还是不要用了,为了几个简单的业务去学习一个新产品,不值当。它适合比较复杂的业务及业务规则需要实时修改的,它能帮上很多忙。
这里只讲了Drools Engine的粗枝大叶,Drools 还有其它的组件,下次再聊。
了解JBoss Drools Engine的更多相关文章
- 开源业务规则引擎JBoss Drools
Drools 是什么? 规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务规 ...
- jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
前言 目前世面上中文的KIE DROOLS Workbench(JBOSS BRMS)的教程几乎没有,有的也只有灵灵碎碎的使用机器来翻译的(翻的不知所云)或者是基于老版本的JBOSS Guvnor即5 ...
- Drools 6.5 Final 入门
Drools 6.5 Final学习笔记 最近项目中要涉及到使用规则对数据进行操作,想到自己实现一个完整且能灵活满足业务需求的规则系统太难了,就想了解一下有没有开源的规则引擎可以使用,后来发现Droo ...
- Linux服务器Jboss运行环境搭建步骤和开机自动启动脚本编写运行
Jboss运行环境:Linux+Jdk+Jboss+jsp系统 Jboss软件说明:类似于Tomcat,就是一个跑Jsp系统的环境,他的站点路径跟Tomcat类似,Tomcat存放站点文件到webap ...
- 规则引擎 drools
https://www.jianshu.com/p/725811f420db 深入了解Drools 简单介绍 笔者正在做风控系统,风控系统里边存在非常多的规则(比如:age < 16 || ag ...
- 几种常见web 容器比较 (tomcat、 jboss 、resin、 weblogic、 websphere、 glassfish)(转)
点击打开PDF下载链接 web 容器比较 tomcat jboss resin weblogic websphere glassfish 1. Tomcat是Apache鼎力支持的Java Web应用 ...
- STS安装Drools
download drools (including "Drools Engine" & "Drools and jBPM tools") from o ...
- Drools的Eclipse_IDEA插件安装
1.说明 Drools使用时不是必须依赖插件的, 只是在安装了相应的插件之后, 在开发工具中能识别到对应的drools文件, 能够进行一些智能提示. 以及使用插件提供的便捷功能. 2.Eclipse插 ...
- drools中的条件 when
目录 1.介绍 2.语法结构 3.模式例子 3.1 单个对象匹配 3.2 匹配任何对象 3.3 带条件匹配 3.3.1 注意事项 3.4 嵌套属性的匹配 3.4.1 访问单个嵌套属性 3.4.2 访问 ...
随机推荐
- YTU 2619: B 友元类-计算两点间距离
2619: B 友元类-计算两点间距离 时间限制: 1 Sec 内存限制: 128 MB 提交: 469 解决: 252 题目描述 类Distance定义为类Point的友元类来实现计算两点之间距 ...
- static_cast 和 dynamic_cast 的区别
static_cast一般用来将枚举类型转换成整型,或者整型转换成浮点型.也可以用来将指向父类的指针转换成指向子类的指针.做这些转换前,你必须确定要转换的数据确实是目标类型的数据,因为static_c ...
- 简单理解Hibernate三种状态的概念及互相转化
本文描述了Hibernate三种状态的概念及互相转化.Java对象的生命周期中有三种状态,而且互相转化.它们分别是临时状态,持久化状态,以及游离状态. AD:WOT2015 互联网运维与开发者大会 热 ...
- 线程中无法实例化spring注入的服务的解决办法
问题描述 在Java Web应用中采用多线程处理数据,发现Spring注入的服务一直报NullPointerException.使用注解式的声明@Resource和XML配置的bean声明,都报空指针 ...
- 移动WebApp开发框架(珍藏)
1.Jquery Mobilehttp://demos.jquerymobile.com/1.4.5/button-markup/http://andymatthews.net/code/jQuer ...
- 代码开光,Orz
有一次在cf上看到了,666,- - // // _oo0oo_ // o8888888o // 88" . "88 // (| -_- |) // 0\ = /0 // ___/ ...
- KVC和KVO的区别
kvc和kvo 1.kvc Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性.KVO 就 ...
- mysql二
日期 MONTHNAME(birth) 月份的英文 模式匹配 变量 统计
- linux 命令行字符终端terminal下强制清空回收站
回收站其实就是一个文件夹,存放被删掉的文件. ubuntu 回收站的路径: $HOME/.local/share/Trash/ 强制清空回收站: rm -fr $HOME/.local/share/T ...
- aspose.words复制插入同一word文档中的某个页面
选择word模板 Document doc = new Document(Server.MapPath("~\\templet") + "\\" + name. ...