分享好友 最新动态首页 最新动态分类 切换频道
规则引擎之drools入门
2024-12-28 18:58

现实生活中,规则无处不在。对于某些企业级应用,诸如欺诈检测软件,购物车,活动监视器,信用和保密应用之类的系统,经常会有大量的、错综复杂的业务规则配置,而且随着企业管理者的决策变化,这些业务规则也会随之发生更改。我们开发人员不得不一直处理软件中的各种复杂问题,不仅需要将所有数据进行关联,还要尽可能快地一次性处理更多的数据,甚至还需要以快速的方式更新相关机制。

我们的日常生活是由规则驱动的。每次我们在开车的时候停在红灯处,之所以这样做,因为我们遵循一条规则,灯变红时我们应该停下来。如果你跳起来,最终会落到地面,这是由地球引力所决定的,它可以被表示成简单的数学方程。然而,对于我们生活日常中的规则,我们使用更加简单的结构来表示:当 XXX 的时候,做 XXX 的事。

这种结构对于组织复杂的业务逻辑非常适用。几乎所有复杂的业务场景都是由大量简单规则组成,它们共同提供了全面的复杂评估。整个评估过程开始于某一个简单的规则,然后不断地进行推导及冲突处理,最终得到一个评估结果。

不同的规则引擎的语法可能会有所不同,但基本都是如下这种经典结构,我们介绍的 Drools 也是如此。一旦某组数据满足条件匹配,则会用匹配到的数据执行某些特定的动作。

业务规则都是基于这种声明式的编程范例,而条件只是作为过滤器,只要数据被引入到符合条件的规则引擎,就可以确定需要执行的规则或规则组。这意味着流程的控制既不是由规则的编写顺序决定,也不是数据的输入顺序决定,而是由规则声明的条件确定的。

在简单地了解过规则以后,你可能仍然对为什么使用规则而感到困惑。如果只是一个或几个逻辑判断,确实没有必要使用规则引擎,命令行语言可以更好地满足我们的需求。然而,业务规则往往是一个庞大且不断变化的规则组合,这使得系统非常复杂,如果只是使用常规代码,则会产生大量的维护工作。

随着业务规则的增长或应用场景的变化,需求会不断地变更,此时,我们可以通过调整规则而使其得到实现。主要是因为业务规则遵循以下原则:

学习一样新东西的最好的方法就是尝试使用它,下面编写一个简单的 Drools 应用程序。首先,我们需要创建一个 Maven 工程,然后在其 pom.xml 文件添加如下包依赖:

在 resources 目录下创建文件 helloworld.drl 文件,内容如下:

在 resources/META-INF 目录下创建 kmodule.xml 文件,kmodule.xml 用来描述知识库资源的选择及知识库与会话的配置,内容如下:

创建单元测试类 HelloWorldTest,内容如下:

运行单元测试即可输出 HelloWorld 字样。

现在我们已经执行了我们的第一条规则,是时候去了解一下规则语言了。我们先分析下我们之前写的规则,它的结构由条件和结果组成:

每个 drl 都必须声明一个包名,这个包名与 Java 里面的不同,它不需要与文件夹的层次结构一致。规则名是规则的唯一标识,所以规则编写过程中需要保证它是不重复的。规则的是按照 DRL 语言编写的,条件表示永远为真,即该条规则总会获得执行。而规则的使用 Java 语言实现,简单地输出了 HelloWorld 字样。

为了简单起见,这里不对 DRL 作完全的描述,更详细的语法请参考:http://docs.jboss.org/drools/release/6.5.0.Final/drools-docs/html_single/index.html#d0e4235

Drools 规则是在 Java 应用程序上运行的,其要执行的步骤顺序由代码确定。为了实现这一点,Drools 规则引擎将业务规则转换成执行树,如下图所示:

如上图所示,每个规则条件分为小块,在树结构中连接和重用。每次将数据添加到规则引擎中时,它将在与此类似的树中进行求值,并到达一个动作节点,在该节点处,它们将被标记为准备执行特定规则的数据。

Drools 规则引擎基于 ReteOO 算法(对面向对象系统的Rete算法进行了增强和优化的实现),它将与规则进行匹配,以推断相应的规则结果,这个过程称之为模式匹配。

规则引擎默认不会在规则评估时立即执行业务规则,除非我们强制指定。当我们到达一个与规则相匹配的节点时,规则评估会将规则操作与触发数据添加到一个叫作的组件中,如果同一个与多个规则相匹配,就认为这些规则是冲突的,使用管理这些冲突规则的执行顺序。整个生命周期中,规则评估与规则执行之间有着明确的分割。规则操作的执行可能会导致的更新,从而与其它规则相匹配,导致它们的触发,称之为前向链接。

规则引擎虽然非常强大,但并非所有场景都适用。一般来说,规则引擎适用的项目都具有以下一个或多个特征:

最新文章
小程序商城全过程-附详细代码
完整微信小程序商城源码,前后端1、App/Common/Conf/db.php 数据库连接参数修改;2、App/Api/Conf/config.php 微信小程序的appid、secret、mchid、key、notify_url,SELF_ROOT的参数修改;3、ThinkPHPLibraryVendorwxpaylibWxPay.Config.ph
淘宝无货源店铺怎么运营才能有订单呢?
无货源店铺模式因其低成本、低风险的特点,吸引了大量新手卖家入驻。如何在没有实体库存的情况下,让店铺吸引顾客、促成交易,成为许多卖家面临的难题。很多商家都想知道淘宝无货源店铺怎么运营才能有订单呢?为了大家可以对这个问题有所了
莲雾果种植:莲雾果少见营养却高,掌握科学技术,种植美味莲雾果
莲雾果是一种生长在热带地区,而且价格和营养价值都非常高的水果,莲雾的果皮鲜红,而且外表光泽度非常诱人,果肉是白色的,果肉的汁多味甜,伴随着淡淡的香气,很多人正是看中了莲雾的市场价值,所以都想要去培育这种水果,其实莲雾的种植
详解如何使用Docker部署一个web项目并打包成镜像文件
docker基本入门以后,可以试试打包docker镜像与dockerfile了docker镜像docker hub仓库有2类仓库,用户仓库和顶层仓库,用户仓库由docker用户创建的,顶层仓库由docker内部的人来管理的。仓库里存放的是镜像文件,那么问题来了 ,怎么去创建
Web前端开发最佳实践(8):还没有给CSS样式排序?其实你可以更专业一些
CSS样式排序是指按照一定的规则排列CSS样式属性的定义,排序并不会影响CSS样式的功能和性能,只是让代码看起来更加整洁。CSS代码的逻辑性并不强,一般的开发者写CSS样式也很随意,所以如果不借助工具,不太容易按照既定的顺序来定义CSS属性
百度框架户开户一天最低消费多少钱?
一天最低消费多少钱?百度,是百度直接开下来的账户、账户消费要求很高、对于普通客户说讲、一天消费几百元或者一千多、都没办法跑框架户、框架最低消费要求3000元、框架户是按季度、按月考核、至于客户、1~2天没跑、也不会影响到账户推广
笔趣阁纯净版小说阅读器APP功能
笔趣阁纯净版小说阅读器app是一款非常强大的小说阅读器软件。该软件不仅可以给大家提供海量的小说阅读资源,同时还有着非常舒适的阅读环境。喜欢看什么样的小说都可以直接在这里找到并观看。所有的小说都是不需要花钱看的。随时都可以免费
Python编程基础及应用答案,python编程基础课后答案
Python入门教程 非常详细(从小白到高级)(新版)PS:欢迎大家来学习本教程,如果有什么不会的欢迎留言,我将随时解答;如果有不足之处欢迎大家留言,同时我欢迎大家来喷不足之处并提出建议,以方
论坛发外链,流量高、效果佳!59
论坛外链作为一种有效且高性价比的外链建设方式,一直受到SEO工作者的青睐。通过在高权重、相关性强的论坛中发布外链,不仅可以为网站带来流量,更能提升网站在搜索引擎中的排名。那么,哪些论坛适合发布外链呢?如何高效进行论坛发外链?
泉州seo优化分析(泉州seo公司排名)
大家好,今天小编关注到一个比较有意思的话题,就是关于泉州seo优化分析的问题,于是小编就整理了2个相关介绍泉州seo优化分析的解答,让我们一起看看吧。电子商务未来发展怎么样?网站好好的,360突然不收录了?谢谢邀请!2018年,中国电子
相关文章
推荐文章
发表评论
0评